Он использует стиль, основанный на языке. В принципе, для даты, указанной выше, если вы американец, тогда дата будет читаться как yyyy-MM-dd hh:mm:ss
, однако, если использовать на разных языках, тогда это будет (глупо) читаться как yyyy-dd-MM hh:mm:ss
.
Если вы используете строки для дат (например, ваш литерал здесь), а затем стремитесь использовать однозначный формат. В SQL сервере, независимо от типа данных и языка, это yyyy-MM-ddThh:mm:ss.nnnnnnn
и yyyyMMdd
.
Если вы конвертируете в (n)varchar
, всегда используйте код стиля (и длину для varchar
) для согласованных результатов.
Итак, для своего значения вы можете запустить следующую команду, чтобы узнать, какое значение преобразования будет по умолчанию для всех языков в вашем экземпляре:
DECLARE Languages CURSOR FOR
SELECT alias
FROM sys.syslanguages;
DECLARE @Alias sysname,
@SQL nvarchar(MAX);
CREATE TABLE #ConvertedDates (Alias sysname, dt datetime, converted nvarchar(25));
DECLARE @dt datetime = '2020-05-06T00:00:00'
OPEN Languages
FETCH NEXT FROM Languages
INTO @Alias;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = N'SET LANGUAGE ' + QUOTENAME(@Alias) + N'; INSERT INTO #ConvertedDates(Alias,dt,converted) VALUES(N' + QUOTENAME(@Alias,'''') + ',@dt,CONVERT(nvarchar(25),@dt));';
EXEC sys.sp_executesql @SQL, N'@dt datetime', @dt;
FETCH NEXT FROM Languages
INTO @Alias;
END;
CLOSE Languages;
DEALLOCATE Languages;
SELECT *
FROM #ConvertedDates;
DROP TABLE #ConvertedDates;
Да, это курсор. Я хотел убедиться, что каждый оператор Dynami c запускается сам по себе, чтобы гарантировать сохранение языка для каждого преобразования.