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