Bardziej niezależnym od języka wyborem literałów łańcuchowych jest międzynarodowy standard ISO 8601 w formacie „RRRR-MM-DDTgg: mm: ss”. Użyłem zapytania SQL poniżej, aby przetestować format i rzeczywiście działa we wszystkich językach SQL w 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
Zgodnie z sekcją Formaty daty i godziny literału ciągu w witrynie Microsoft TechNet, standardowy format daty ANSI Standard SQL „RRRR-MM-DD hh: mm: ss” powinien być „wielojęzyczny”. Jednak przy użyciu tego samego zapytania format ANSI nie działa we wszystkich językach SQL.
Na przykład w języku duńskim będzie wiele błędów, takich jak następujące:
Błąd w języku duńskim Konwersja typu danych varchar na typ danych typu data i godzina spowodowała, że wartość spoza zakresu.
Jeśli chcesz zbudować zapytanie w C # do uruchomienia na SQL Server i musisz przekazać datę w formacie ISO 8601, użyj specyfikatora formatu „s” sortable :
string.Format("select convert(datetime2, '{0:s}'", DateTime.Now);