我的表格中有一个名为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,则会找到该行。
如果我在选项mdy
为dateformat
时在另一个数据库副本上运行它,则dmy
不会返回任何内容。
为什么会这样?
答案 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