Более независимым от языка выбором для строковых литералов является международный стандарт ISO 8601 в формате «ГГГГ-ММ-ДДTчч: мм: сс». Я использовал приведенный ниже запрос SQL для проверки формата, и он действительно работает на всех языках SQL в sys.syslanguages :
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 Standard SQL «ГГГГ-ММ-ДД чч: мм: сс» должен быть «многоязычным». Однако при использовании того же запроса формат ANSI работает не на всех языках SQL.
Например, на датском языке будет много ошибок, например следующих:
Ошибка на датском языке. Преобразование типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона.
Если вы хотите создать запрос на C # для запуска на SQL Server и вам нужно передать дату в формате ISO 8601, используйте описатель формата Sortable «s» :
string.Format("select convert(datetime2, '{0:s}'", DateTime.Now);