SQL SELECT中的Dateformat奇怪

时间:2012-08-11 14:17:06

标签: sql sql-server

我的表格中有一个名为DATETIME的{​​{1}}列。

此列中的值为dtInsertDate。我知道这个日期是2012年8月10日。

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

'2012-08-10 22:48:41.047'

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

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

为什么会这样?

1 个答案:

答案 0 :(得分:5)

原因是dmy会将您的字符串文字解释为第一天 - 因此是10月8日而不是8月10日。

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

WHERE dtinsertdate = '20120810 22:48:41.047';

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

另一种选择是保留破折号但是注入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