CAST DateTime 到 VARCHAR,然后使用 LIKE 时出现奇怪的结果

Weird results when CAST DateTime to VARCHAR, then use LIKE

有一栏叫OrderDate (data like this :2007-06-02 00:00:00.000)

我试图通过 LIKE 获取 2007-06 年的日期:

WHERE OrderDate LIKE '2007-06%'

却一无所获。 然后我尝试了 CAST:

WHERE CAST(OrderDate AS VARCHAR) LIKE '2007-06%'

还是一无所获。 有人请帮我吗?我只想用 LIKE 来做这个。

此外,WHERE OrderDate LIKE '%2007%' 可以获取从 2007 年开始的数据,但 '2007%' 什么也没有。 SQL 中的新首发。 谢谢!!

WHERE OrderDate >= '2007-06-01' AND OrderDate < '2007-07-01'

使用日期时间实例比较日期时间,不要尝试转换为字符串。值 '2007-06-01' 将像 '2007-07-01' 一样转换为 DateTime。 OrderDate 应该已经是 Date 或 DateTime 类型。

如果您想检索日期或日期时间的一部分,还可以使用内置函数。


编辑

这不起作用的原因 WHERE CAST(OrderDate AS VARCHAR) LIKE '2007-06%' 是因为您没有为 varchar 指定长度。将日期时间转换为字符串后,以下内容将采用日期时间的前 7 个字符。

WHERE CAST(OrderDate AS VARCHAR(7)) LIKE '2007-06%'

另一个问题是你不能保证使用cast时会输出哪种格式。如果你想要一个字符串输出,你应该使用 CONVERT 并指定输出格式。对于 ISO8601 格式化你这个。

WHERE CONVERT(VARCHAR(10), OrderDate, 126) LIKE '2007-06%'

再次声明,我真的不推荐这种方法。最好的情况是,如果数据上有任何索引,它将忽略它们,从而使您的查询非常慢。最坏的情况是您在查询中使用不正确的日期时间比较字符串出错,但它永远不会被捕获,因为它被视为 varchar( 如果您尝试 [=17,我上面的原始查询会引发错误=])

使用YEARMONTH代替LIKE

WHERE 
    YEAR(OrderDate) = 2017 AND
    MONTH(OrderDate) = 6

您可以使用下面的查询查看输出。你会看到问题的。

例如

SELECT CAST(OrderDate AS VARCHAR) -- May 27 2017  1:22AM