web-dev-qa-db-ja.com

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

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

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

親切に助けて!ありがとう。

108
Shee

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 にあるとされる文化です。

185
RichardTheKiwi

文字列リテラルのためのより言語に依存しない選択は国際標準 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 Server上で実行するためにC#でクエリを作成したい場合に、ISO 8601形式の日付を渡す必要がある場合は、 Sortable "s"形式指定子 を使用します。

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

Management Studioは次のようなスクリプトを作成します。

insert table1 (foodate) values(CAST(N'2012-06-18 10:34:09.000' AS DateTime))
14
Eduardo Aguiar

あなたはそれを追加する必要があります

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

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

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

区切り文字は/である必要があり、単一の'引用符で囲む必要があります。

2
Johan

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

これはC#の例です。

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

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

FooDateはあなたのフォーマットであなたの日付を含むdatetime変数です。

1
Pankaj

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

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))) 
1
Guy E