SQL Serverに日時を挿入するSQLクエリ


133

datetime以下のSQLクエリを使用してテーブル(SQL Server)に値を挿入したい

insert into table1(approvaldate)values(18-06-12 10:34:09 AM);

しかし、このエラーメッセージが表示されます。 Incorrect syntax near '10'.

私は引用符でそれを試しました

insert into table1(approvaldate)values('18-06-12 10:34:09 AM');

このエラーメッセージが表示される Cannot convert varchar to datetime

親切に助けてください!ありがとう。

回答:


229

SQL Serverで日付を明確に決定するには、YYYYMMDDを使用します。

insert into table1(approvaldate)values('20120618 10:34:09 AM');

このdd-mm-yy hh:mm:ss xmフォーマットと結婚している場合は、特定のスタイルでCONVERTを使用する必要があります。

insert table1 (approvaldate)
       values (convert(datetime,'18-06-12 10:34:09 PM',5));

5これがイタリアの日付のスタイルです。まあ、イタリア人だけでなく、それがBooks Onlineに起因する文化です。


1
ありがとうございます。ところで、DD-MM-YY形式で入力することはできませんか?
She

@RichardTheKiwiどういう5意味ですか?
Shee

@Sheeはフッターに回答を追加しました
RichardTheKiwi

4
私は修正しました-あなたが使用している場合YYYYMMDD HH:MM:SS(24時間形式-世界形式、米国以外の誰もが軍だけでなくこれを使用します...)ダッシュなし - British言語でも動作します YYYY-MM-DD HH:MM:SSただし、使用すると失敗します-その場合(ダッシュを使用)、日付と時刻をリテラルで区切る必要がありますT
marc_s 2012年

1
@Shee SET DATEFORMATステートメントを見てください。これは個々の接続の設定ですが、設定はサーバー全体で指定できます。またSET LANGUAGE、基数などに使用される文字などを制御するように指定することもできます。日付形式は、これから継承します(これもサーバーレベルまたは接続レベルで)。デフォルトは米国英語で、mdyは米国形式です。ただし、4年の日付を持つymdは常に機能します。
ベーコンビット2015年

29

文字列リテラルのより言語に依存しない選択は、国際標準ISO 8601形式 "YYYY-MM-DDThh:mm:ss"です。以下のSQLクエリを使用して形式をテストしましたが、sys.syslanguagesのすべてのSQL言語で実際に機能します

declare @sql nvarchar(4000)

declare @LangID smallint
declare @Alias sysname

declare @MaxLangID smallint
select @MaxLangID = max(langid) from sys.syslanguages

set @LangID = 0

while @LangID <= @MaxLangID
begin

    select @Alias = alias
    from sys.syslanguages
    where langid = @LangID

    if @Alias is not null
    begin

        begin try
            set @sql = N'declare @TestLang table (langdate datetime)
    set language ''' + @alias + N''';
    insert into @TestLang (langdate)
    values (''2012-06-18T10:34:09'')'
            print 'Testing ' + @Alias

            exec sp_executesql @sql
        end try
        begin catch
            print 'Error in language ' + @Alias
            print ERROR_MESSAGE()
        end catch
    end

    select @LangID = min(langid)
    from sys.syslanguages
    where langid > @LangID
end

Microsoft TechNet の文字列リテラルの日付と時刻の形式のセクションによると、標準のANSI標準SQL日付形式「YYYY-MM-DD hh:mm:ss」は「複数言語」であると想定されています。ただし、同じクエリを使用すると、ANSI形式はすべてのSQL言語で機能するわけではありません。

たとえば、デンマーク語では次のような多くのエラーが発生します。

言語デンマーク語のエラーvarcharデータ型をdatetimeデータ型に変換すると、範囲外の値が発生しました。

SQLサーバーで実行するクエリをC#で作成し、ISO 8601形式で日付を渡す必要がある場合は、並べ替え可能な "s"形式指定子を使用します

string.Format("select convert(datetime2, '{0:s}'", DateTime.Now);

YYYYMMDD日付のみに使用でき、YYYY-MM-DDThh:mm:ss(ダッシュとはい、T日付と時刻の間の部分!)またはYYYYMMDD HH:MM:SS(ダッシュなし、分離リテラルなし)のどちらかで本当に言語に依存しないようにすることができます...
marc_s

1
@marc_s:コメントありがとうございます。回答を編集して、ISO 8601形式(言及したとおりのTリテラルを含む)について言及しました。
ポールウィリアムズ

@TestLang(langdate)値( '2012-06-18T10:34:09')に挿入するのが最良の答えです。
MERTDOĞAN17年


8

次のように追加する必要があります

insert into table1(date1) values('12-mar-2013');

2

変換を使用する必要はありません。引用符で囲まれた日付としてISO 8601形式でリストするだけです。
そのようです:

select * from table1 where somedate between '2000/01/01' and '2099/12/31'

セパレータはa /である必要があり、単一'引用符で囲む必要があります。


1

プログラミング言語を介して値を保存する場合

これはC#の例です

日付を保存するには、まず変換してから保存する必要があります

insert table1 (foodate)
   values (FooDate.ToString("MM/dd/yyyy"));

FooDateは、日付形式の日付を含む日付時刻変数です。


1

私はより一般的な問題に遭遇しました:異なる(そして必ずしも知られていない)日時フォーマットを取得し、それらを日時列に挿入します。私は最終的にスカラー関数になった次のステートメントを使用してそれを解決しました(ODBCの正規、アメリカ、ANSIおよびbritish \ franch日付スタイルに関連-拡張可能):

insert into <tableName>(<dateTime column>) values(coalesce 
(TRY_CONVERT(datetime, <DateString, 121), TRY_CONVERT(datetime, <DateString>, 
101), TRY_CONVERT(datetime, <DateString>, 102), TRY_CONVERT(datetime, 
<DateString>, 103))) 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.