下記の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
親切に助けて!ありがとう。
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 にあるとされる文化です。
文字列リテラルのためのより言語に依存しない選択は国際標準 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);
Management Studioは次のようなスクリプトを作成します。
insert table1 (foodate) values(CAST(N'2012-06-18 10:34:09.000' AS DateTime))
あなたはそれを追加する必要があります
insert into table1(date1) values('12-mar-2013');
Convertを使う必要はありません。引用符で囲まれた日付としてISO 8601形式でリストするだけです。
そのようです:
select * from table1 where somedate between '2000/01/01' and '2099/12/31'
区切り文字は/
である必要があり、単一の'
引用符で囲む必要があります。
プログラミング言語で値を保存している場合
これはC#の例です。
日付を保存するには、最初に変換してから保存する必要があります。
insert table1 (foodate)
values (FooDate.ToString("MM/dd/yyyy"));
FooDateはあなたのフォーマットであなたの日付を含むdatetime変数です。
私はもっと一般的な問題に遭遇しました:異なる(そして必ずしも知られていない)日時フォーマットを取得して日時カラムに挿入する。私はこのステートメントを使用してそれを解決しました。これはついにスカラー関数になりました(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)))