SQL SELECT中的日期格式异常

SQL SELECT中的日期格式异常,sql,sql-server,Sql,Sql Server,我有一个表,它有一个名为dtInsertDate的DATETIME列 此列中的值为'2012-08-10 22:48:41.047'。我知道这个日期是2012年8月10日 我想运行以下SELECT语句来检索此行: select * from myTable where dtinsertdate = '2012-08-10 22:48:41.047' 令人费解的是,如果我在选项dateformat为mdy时运行此SELECT,它会找到该行 如果在选项dateformat为dmy时在数据库的另一个

我有一个表,它有一个名为
dtInsertDate
DATETIME

此列中的值为
'2012-08-10 22:48:41.047'
。我知道这个日期是2012年8月10日

我想运行以下SELECT语句来检索此行:

select *
from myTable
where dtinsertdate = '2012-08-10 22:48:41.047'
令人费解的是,如果我在选项
dateformat
mdy
时运行此SELECT,它会找到该行

如果在选项
dateformat
dmy
时在数据库的另一个副本上运行它,
SELECT
不会返回任何内容


这是为什么?

原因是dmy导致字符串文字被解释为第一天-因此是10月8日而不是8月10日

解决方案是始终对日期文本使用明确的格式(或者使用正确类型的参数,而不是首先处理从字符串的转换)

正如您所发现的,日期中的这些破折号会根据语言/日期格式设置对实际值进行不同的解释

另一种选择是保留破折号,但插入T而不是空格,例如:

WHERE dtinsertdate = '2012-08-10T22:48:41.047';
您的原稿更具可读性,但只有当您将语言和日期格式固定(例如,尝试使用
SET language FRENCH;
)时,它才能保证工作。试试这个实验:

SET DATEFORMAT DMY;
DECLARE @d DATETIME = '2012-08-10 22:48:41.047'
SELECT MONTH(@d);
GO

SET LANGUAGE FRENCH;
DECLARE @d DATETIME = '2012-08-10 22:48:41.047'
SELECT MONTH(@d);
GO

SET DATEFORMAT MDY;
DECLARE @d DATETIME = '2012-08-10 22:48:41.047'
SELECT MONTH(@d);
GO

SET DATEFORMAT MDY;
SET LANGUAGE ENGLISH;
DECLARE @d DATETIME = '2012-08-10 22:48:41.047'
SELECT MONTH(@d);
GO
有时结果是8,有时结果是10。现在用我上面建议的两种格式中的一种再试一次-结果总是8

我这里有很多有趣的细节值得一读:

<>但是,对于你所说的特定问题,总是、总是、总是使用以下格式的日期/时间文本,我不认为任何其他格式是安全的。 对于日期+时间:

YYYY-MM-DDTHH:MM:SS...
YYYYMMDD HH:MM:SS...
YYYYMMDD
仅限日期:

YYYY-MM-DDTHH:MM:SS...
YYYYMMDD HH:MM:SS...
YYYYMMDD

原因是dmy导致字符串文字被解释为第一天-因此是10月8日,而不是8月10日

解决方案是始终对日期文本使用明确的格式(或者使用正确类型的参数,而不是首先处理从字符串的转换)

正如您所发现的,日期中的这些破折号会根据语言/日期格式设置对实际值进行不同的解释

另一种选择是保留破折号,但插入T而不是空格,例如:

WHERE dtinsertdate = '2012-08-10T22:48:41.047';
您的原稿更具可读性,但只有当您将语言和日期格式固定(例如,尝试使用
SET language FRENCH;
)时,它才能保证工作。试试这个实验:

SET DATEFORMAT DMY;
DECLARE @d DATETIME = '2012-08-10 22:48:41.047'
SELECT MONTH(@d);
GO

SET LANGUAGE FRENCH;
DECLARE @d DATETIME = '2012-08-10 22:48:41.047'
SELECT MONTH(@d);
GO

SET DATEFORMAT MDY;
DECLARE @d DATETIME = '2012-08-10 22:48:41.047'
SELECT MONTH(@d);
GO

SET DATEFORMAT MDY;
SET LANGUAGE ENGLISH;
DECLARE @d DATETIME = '2012-08-10 22:48:41.047'
SELECT MONTH(@d);
GO
有时结果是8,有时结果是10。现在用我上面建议的两种格式中的一种再试一次-结果总是8

我这里有很多有趣的细节值得一读:

<>但是,对于你所说的特定问题,总是、总是、总是使用以下格式的日期/时间文本,我不认为任何其他格式是安全的。 对于日期+时间:

YYYY-MM-DDTHH:MM:SS...
YYYYMMDD HH:MM:SS...
YYYYMMDD
仅限日期:

YYYY-MM-DDTHH:MM:SS...
YYYYMMDD HH:MM:SS...
YYYYMMDD