Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server实例从varchar转换为datetime时使用的默认日期样式是什么?_Sql Server_Datetime_Type Conversion_Varchar - Fatal编程技术网

Sql server SQL Server实例从varchar转换为datetime时使用的默认日期样式是什么?

Sql server SQL Server实例从varchar转换为datetime时使用的默认日期样式是什么?,sql-server,datetime,type-conversion,varchar,Sql Server,Datetime,Type Conversion,Varchar,我在两台不同的服务器上运行了此SQL查询: declare @test as datetime='2020-05-06 00:00:00' select Convert (nvarchar,@test) 两台服务器上的结果不同: 2020年5月6日12:00 2020年6月5日上午12:00 我知道这背后的原因,当SQL Server读取我在declare语句中传递的字符串2020-05-06 00:00:00并将其转换为DateTime时,它使用默认的日期样式 我是否能够配置此默认样式,或

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

declare @test as datetime='2020-05-06 00:00:00'
select Convert (nvarchar,@test) 
两台服务器上的结果不同:

  • 2020年5月6日12:00
  • 2020年6月5日上午12:00
  • 我知道这背后的原因,当SQL Server读取我在declare语句中传递的字符串
    2020-05-06 00:00:00
    并将其转换为
    DateTime
    时,它使用默认的日期样式


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

    它使用基于语言的样式。基本上,对于上述日期,如果你是美国人,那么日期将被解读为
    yyyy-MM-dd hh:MM:ss
    ,然而,如果使用超过语言,那么它将被(愚蠢地)解读为
    yyy-dd-MM hh:MM:ss

    如果您使用字符串表示日期(如此处的文字),则应使用明确的格式。在SQL Server中,无论数据类型和语言如何,都是
    yyyy-MM-ddThh:MM:ss.nnnnnnn
    yyyyymmdd

    如果要转换为
    (n)varchar
    ,请始终使用a(以及
    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;
    

    是的,那是一个光标。我想确保每个动态语句都能独立运行,以确保每次转换都能保留语言。

    它使用基于语言的样式。基本上,对于上述日期,如果你是美国人,那么日期将被解读为
    yyyy-MM-dd hh:MM:ss
    ,然而,如果使用超过语言,那么它将被(愚蠢地)解读为
    yyy-dd-MM hh:MM:ss

    如果您使用字符串表示日期(如此处的文字),则应使用明确的格式。在SQL Server中,无论数据类型和语言如何,都是
    yyyy-MM-ddThh:MM:ss.nnnnnnn
    yyyyymmdd

    如果要转换为
    (n)varchar
    ,请始终使用a(以及
    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,我通常使用这种代码。当SQLServer将其自身从varchar转换为date时,它的默认行为让我感到惊讶。实际代码将日期作为参数发送到存储过程,这就是为什么“我认为”我们不能完全控制格式的原因。根据您的回答,我猜您所说的语言是指安装时使用的语言?或者安装程序本身?不,是
    登录的语言,@PaulKaram。感谢您的回复,是的,我知道可以使用样式代码将日期转换为(n)varchar,我通常使用它。当SQLServer将其自身从varchar转换为date时,它的默认行为让我感到惊讶。实际代码将日期作为参数发送到存储过程,这就是为什么“我认为”我们不能完全控制格式的原因。根据您的回答,我猜您所说的语言是指安装时使用的语言?或者安装程序本身?不,是
    登录的语言,@PaulKaram。