如何停止 SQL Server 交换月份和日期?

mar*_*eek 3 sql sql-server datetime datetime-format sql-server-2016

我有以下查询:

DECLARE @someDateTime DATETIME = '2019-12-01 00:00:00.000'; -- 1st December 2019
SELECT @someDateTime;
Run Code Online (Sandbox Code Playgroud)

结果

DECLARE @someDateTime DATETIME = '2019-12-01 00:00:00.000'; -- 1st December 2019
SELECT @someDateTime;
Run Code Online (Sandbox Code Playgroud)

我预计结果是2019-12-01 00:00:00.000(2019 年 12 月 1)- 由于某种未知原因,月份和日期交换了。

直到最近,我对这种格式还没有遇到过任何问题。

如何以“YYYY-MM-DD HH:mm:ss.000”格式输入日期,并在分配给变量/在选择中显示后保持该格式?
什么设置决定了可能已更改的格式?

潜在有用的信息

dbcc useroptions
Run Code Online (Sandbox Code Playgroud)

结果:

2019-01-12 00:00:00.000
Run Code Online (Sandbox Code Playgroud)

服务器属性

我尝试过的事情:

查询1

将日期更改为如果交换则无效的日期

DECLARE @someDateTime DATETIME = '2019-12-20 00:00:00.000';
SELECT @someDateTime;
Run Code Online (Sandbox Code Playgroud)

结果:

消息 242,级别 16,状态 3,第 4 行
varchar 数据类型到日期时间数据类型的转换导致值超出范围。

查询2

声明变量后设置变量

DECLARE @someDateTime DATETIME;
SET @someDateTime = '2019-12-01 00:00:00.000';
SELECT @someDateTime;
Run Code Online (Sandbox Code Playgroud)

结果 - 不期望的:

dbcc useroptions
Run Code Online (Sandbox Code Playgroud)

查询3

将变量插入表变量

DECLARE @someDateTime DATETIME = '2019-12-01 00:00:00.000';
DECLARE @someTable TABLE (someDateTimeColumn DATETIME);
INSERT @someTable VALUES (@someDateTime);
SELECT * FROM @someTable
Run Code Online (Sandbox Code Playgroud)

结果 - 不期望的:

Set Option | Value
----------   -----
...
language   | British
dateformat | dmy
...
Run Code Online (Sandbox Code Playgroud)

查询4

将数据直接插入到表变量中

DECLARE @someTable TABLE (someDateTimeColumn DATETIME);
INSERT @someTable VALUES ('2019-12-01 00:00:00.000');
SELECT * FROM @someTable
Run Code Online (Sandbox Code Playgroud)

结果:不期望的

DECLARE @someDateTime DATETIME = '2019-12-20 00:00:00.000';
SELECT @someDateTime;
Run Code Online (Sandbox Code Playgroud)

查询5

更改输入字符串的格式

DECLARE @someDateTime DATETIME = '01/12/2019';
SELECT @someDateTime;
Run Code Online (Sandbox Code Playgroud)

结果 - 期望

DECLARE @someDateTime DATETIME;
SET @someDateTime = '2019-12-01 00:00:00.000';
SELECT @someDateTime;
Run Code Online (Sandbox Code Playgroud)

查询6

更改输入字符串的格式

DECLARE @someDateTime DATETIME = '2019-12-01T00:00:00.00';
SELECT @someDateTime;
Run Code Online (Sandbox Code Playgroud)

结果 - 期望:

2019-01-12 00:00:00.000
Run Code Online (Sandbox Code Playgroud)

查询7

更改输入字符串的格式

DECLARE @someDateTime DATETIME = '2019-12-01';
SELECT @someDateTime;
Run Code Online (Sandbox Code Playgroud)

结果 - 不期望的:

DECLARE @someDateTime DATETIME = '2019-12-01 00:00:00.000';
DECLARE @someTable TABLE (someDateTimeColumn DATETIME);
INSERT @someTable VALUES (@someDateTime);
SELECT * FROM @someTable
Run Code Online (Sandbox Code Playgroud)

查询8

使用SET DATEFORMAT

SET DATEFORMAT ymd
DECLARE @someDateTime DATETIME = '2019-12-01';
SELECT @someDateTime;
Run Code Online (Sandbox Code Playgroud)

结果 - 期望

someDateTimeColumn
------------------
2019-01-12 00:00:00.000
Run Code Online (Sandbox Code Playgroud)

Tim*_*sen 5

您可以使用始终解释为年-月-日的文字格式YYYYMMDD,无论 SQL Server 的区域设置如何:

DECLARE @someDateTime DATETIME = '20191201 00:00:00.000';
Run Code Online (Sandbox Code Playgroud)