Sql server SQL Server实例从varchar转换为datetime时使用的默认日期样式是什么?
我在两台不同的服务器上运行了此SQL查询: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时,它使用默认的日期样式 我是否能够配置此默认样式,或
declare @test as datetime='2020-05-06 00:00:00'
select Convert (nvarchar,@test)
两台服务器上的结果不同:
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。