它使用基于语言的样式。基本上,对于上面的日期,如果你是美国人,那么日期将被读作yyyy-MM-dd hh:mm:ss,但是,如果使用多种语言,那么它会(愚蠢地)读作yyyy-dd-MM hh:mm:ss。
如果您使用字符串作为日期(就像这里的文字),那么目标是使用明确的格式。在 SQL Server 中,无论数据类型和语言如何,它们都是 yyyy-MM-ddThh:mm:ss.nnnnnnn 和 yyyyMMdd。
如果您要转换为(n)varchar,请始终使用style code(以及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;
是的,这是一个光标。我想确保每个动态语句自己运行,以确保每次转换都保留语言。