文字列リテラルのより言語に依存しない選択は、国際標準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);