TSQL查询比较日期的正确语法

TSQL查询比较日期的正确语法,tsql,datetime,Tsql,Datetime,我正在寻找在TSQL WHERE子句中测试的正确语法,如果 datetime2(7)类型等于另一个 WHERE (CAST(modifiedDate AS DATETIME) = '9/29/2016 3:24:24 PM') 我也试过了 WHERE (CAST(modifiedDate AS DATETIME) LIKE '9/29/2016 3:24:24 PM') 及 我相信我的右边陈述不正确,但这是数据库中的确切值 我正在寻找所有与datetimestamp匹配的记录 说得清楚一点,

我正在寻找在TSQL WHERE子句中测试的正确语法,如果 datetime2(7)类型等于另一个

WHERE (CAST(modifiedDate AS DATETIME) = '9/29/2016 3:24:24 PM')
我也试过了

WHERE (CAST(modifiedDate AS DATETIME) LIKE '9/29/2016 3:24:24 PM')

我相信我的右边陈述不正确,但这是数据库中的确切值

我正在寻找所有与datetimestamp匹配的记录

说得清楚一点,我确实尝试过搜索其他结果……”

我觉得这个网站上的搜索结果有点古怪

数据库字段类型


不确定您在哪里遇到问题。我想这取决于你如何存储日期值。如果是datetime2,这个就可以了

DECLARE @testtable TABLE(
ID INT
, modifieddate DATETIME2)

INSERT INTO @testtable 
(id, modifieddate)
VALUES 

(1, '9/29/2016 3:24:24 PM'),
(2, '2/01/2016 3:24:24 PM'),
(3, '6/25/2016 3:24:24 PM')



SELECT * 
FROM @testtable 

SELECT * 
FROM @testtable 
WHERE CAST(modifieddate AS DATETIME2) = '09/29/2016 3:24:24 PM'

SELECT * 
FROM @testtable 
WHERE modifieddate = '9/29/2016 3:24:24 PM'

SELECT * 
FROM @testtable 
WHERE modifieddate = CAST('09/29/2016 3:24:24 PM' AS DATETIME2)

要比较DATETIME值,需要比较DATETIME值。您可以使用TSQL
CONVERT
函数将字符串转换为日期时间数据类型。例如:

CONVERT(DATETIME, '2016-09-28 15:34:00', 20)
请注意,第三个参数是“样式”。上面的示例使用样式20,即ODBC规范样式YYYY-MM-DD HH:MI:SS(24小时时钟)。还有其他几种可用的样式,也许您可以找到一种与字符串格式匹配的样式。(如果找不到匹配项,则需要使用一些字符串操纵函数将字符串重新格式化为可用样式的格式。)

作为第二个参数,可以使用字符串文字(如上面的示例所示),也可以使用对CHAR或VARCHAR列的引用

参考:


注意:为什么日期时间值在数据库中存储为字符串,而不是日期时间数据类型


如果列的数据类型是
DATETIME2(7)
,那么我认为您应该比较
DATETIME2(7)
数据类型

如果我们做一个“等于”的比较,那将是一个精确的匹配,包括分数秒。如果要匹配给定秒的DATETIME2(7)值,可以使用范围比较:

  WHERE t.my_col_datetime2_7  >= '2016-09-29 15:24:24'
    AND t.my_col_datetime2_7  <  '2016-09-29 15:24:25'
其中t.my\u col\u datetime 2\u 7>=“2016-09-29 15:24:24”
和t.my_col_datetime2_7<'2016-09-29 15:24:25'
注:允许与DATETIME2进行比较的字符串文字格式为
YYYY-MM-DD HH:MI:SS
(24小时时钟),可选小数秒
.nnnnn


参考资料:

播放datetime也会给你千秒的时间。因此,上述方法行不通。还可以尝试使用毫秒进行比较,或者在秒范围内进行范围检查。我的日期字段的值如下='9/29/2016 3:24:24 PM'无毫秒过期。如果您存储为varchar,这应该可以正常工作。作为补充说明,非常确定'9/29/2016 3:24:24 PM'不是datetime2(7)值。它们存储为datetime2(7)这也不起作用…其中(CONVERT(DATETIME,modifiedDate,20)=CONVERT(DATETIME,'09/29/2016 3:24 PM',20))查看您的链接,其中modifieddate='2016-09-29 15:24:24'将“起作用”,因为对于(datetime2(7))
modifieddate
值恰好为
'2016-09-29 15:24:24.0000000'
的行,比较结果将为true。对于除0以外的任何分数秒值,比较结果都将为假,例如
'2016-09-29 15:24:24.56789'
。如果要返回“等于”给定分钟的值,则会遇到类似的问题。这就是为什么标准模式是对datetime使用范围比较。是的。正如日期时间值
'2016-09-29 15:55:24'
不等于没有时间组件的日期文字
'2016-09-29'
。它也不等于分辨率为分钟(无秒)的datetime文字
'2016-09-29 15:55'
。当在文本中省略秒和分数秒时,通常的行为是假定为零。与忽略时间组件时的通常行为一样,假设午夜(时间组件为零…
'00:00:00.000'
datetime2(7)
数据类型的分辨率低至100纳秒…小数点后的小数秒高达7位。
  WHERE t.my_col_datetime2_7  >= '2016-09-29 15:24:24'
    AND t.my_col_datetime2_7  <  '2016-09-29 15:24:25'