【发布时间】:2020-04-24 19:39:11
【问题描述】:
我有以下疑问:
DECLARE @someDateTime DATETIME = '2019-12-01 00:00:00.000'; -- 1st December 2019
SELECT @someDateTime;
结果
2019-01-12 00:00:00.000
我预计结果是 2019-12-01 00:00:00.000(2019 年 12 月 1st 日) - 出于某种未知原因,月份和日期互换。
直到最近,我从未对这种格式有任何疑问。
如何以“YYYY-MM-DD HH:mm:ss.000”格式输入日期,并让它在分配给变量/显示在选择中后保持该格式?
什么设置决定了这种可能已经改变的格式?
可能有用的信息
dbcc useroptions
结果:
Set Option | Value
---------- -----
...
language | British
dateformat | dmy
...
我尝试过的事情:
查询 1
将日期更改为如果交换将无效的内容
DECLARE @someDateTime DATETIME = '2019-12-20 00:00:00.000';
SELECT @someDateTime;
结果:
消息 242,第 16 级,状态 3,第 4 行
将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。
查询 2
变量声明后设置
DECLARE @someDateTime DATETIME;
SET @someDateTime = '2019-12-01 00:00:00.000';
SELECT @someDateTime;
结果 - 不理想:
2019-01-12 00:00:00.000
查询 3
将变量插入到表变量中
DECLARE @someDateTime DATETIME = '2019-12-01 00:00:00.000';
DECLARE @someTable TABLE (someDateTimeColumn DATETIME);
INSERT @someTable VALUES (@someDateTime);
SELECT * FROM @someTable
结果 - 不理想:
someDateTimeColumn
------------------
2019-01-12 00:00:00.000
查询 4
将数据直接插入到表变量中
DECLARE @someTable TABLE (someDateTimeColumn DATETIME);
INSERT @someTable VALUES ('2019-12-01 00:00:00.000');
SELECT * FROM @someTable
结果:不理想
someDateTimeColumn
------------------
2019-01-12 00:00:00.000
查询 5
更改输入字符串的格式
DECLARE @someDateTime DATETIME = '01/12/2019';
SELECT @someDateTime;
结果 - 期望的
2019-12-01 00:00:00.000
查询 6
更改输入字符串的格式
DECLARE @someDateTime DATETIME = '2019-12-01T00:00:00.00';
SELECT @someDateTime;
结果 - 期望:
2019-12-01 00:00:00.000
查询 7
更改输入字符串的格式
DECLARE @someDateTime DATETIME = '2019-12-01';
SELECT @someDateTime;
结果 - 不理想:
2019-01-12 00:00:00.000
查询 8
使用SET DATEFORMAT
SET DATEFORMAT ymd
DECLARE @someDateTime DATETIME = '2019-12-01';
SELECT @someDateTime;
结果 - 期望的
2019-12-01 00:00:00.000
【问题讨论】:
-
SET DATEFORMAT ymd确实会产生所需的输出。但这在没有它的情况下之前确实有效。我不确定发生了什么变化。 -
对于初学者,请使用
datetime2而不是datetime。 “新”(15 岁)类型没有旧的怪癖。其次,使用完整的 ISO8601 格式,包括T。 -
@marmitegeek 显然有人更改了服务器级别的默认设置。
-
Tibor here 详细讨论了所有内容。短版 - 日期时间的分隔格式受语言设置和日期格式设置的影响。有多种格式总是能被正确解释。
标签: sql sql-server datetime sql-server-2016 datetime-format