【问题标题】:What is the default date style used by an instance of SQL Server when converting from varchar to datetime?从 varchar 转换为 datetime 时,SQL Server 实例使用的默认日期样式是什么?
【发布时间】:2020-09-16 19:14:13
【问题描述】:

我在两个不同的服务器上运行了这个 SQL 查询:

declare @test as datetime='2020-05-06 00:00:00'
select Convert (nvarchar,@test) 

两台服务器上的结果不同:

  1. 2020 年 5 月 6 日上午 12:00
  2. 2020 年 6 月 5 日上午 12:00

我知道这背后的原因,当 SQL Server 读取我传递给2020-05-06 00:00:00 的字符串并在声明语句中将其转换为DateTime 时,它使用的是默认日期样式。

我能否配置此默认样式,或者换句话说,在将varchar 转换为datetime 时,SQL Server 中如何选择默认日期样式?是windows的区域设置还是SQL Server里面的一些其他配置?

【问题讨论】:

    标签: sql-server datetime type-conversion varchar


    【解决方案1】:

    它使用基于语言的样式。基本上,对于上面的日期,如果你是美国人,那么日期将被读作yyyy-MM-dd hh:mm:ss,但是,如果使用多种语言,那么它会(愚蠢地)读作yyyy-dd-MM hh:mm:ss

    如果您使用字符串作为日期(就像这里的文字),那么目标是使用明确的格式。在 SQL Server 中,无论数据类型和语言如何,它们都是 yyyy-MM-ddThh:mm:ss.nnnnnnnyyyyMMdd

    如果您要转换为(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;
    

    是的,这是一个光标。我想确保每个动态语句自己运行,以确保每次转换都保留语言。

    【讨论】:

    • 感谢您的回复,是的,我知道可用于将日期转换为 (n)varchar 的样式代码,我通常使用它。当 SQL Server 将其自身从 varchar 转换为 date 时,我只是对 SQL Server 的默认行为感到惊讶。实际代码将日期作为参数发送到存储过程,这就是为什么“我认为”我们无法完全控制格式。根据您的回答,我猜您所说的语言是指安装时使用的语言?还是安装程序本身?
    • 不,LOGIN, @PaulKaram 的语言。
    猜你喜欢
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多