当CAST DateTime为VARCHAR时,结果很奇怪,然后使用LIKE

时间:2017-04-29 05:42:50

标签: sql-server sql-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中的新入门者。 谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

如果您想要检索Date或DateTime的一部分,还可以使用内置函数。

修改

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

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

另一个问题是你不能保证在使用强制转换时会输出哪种格式。如果需要字符串输出,则应使用CONVERT并指定输出格式。对于ISO8601格式化你。

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

同样,我真的不推荐这种方法。最好的情况是,如果数据上有任何索引,它将忽略它们,使您的查询非常慢。在最糟糕的情况下,您使用不正确的日期时间比较字符串在查询中出错,但它永远不会被捕获,因为它被视为varchar(如果您尝试2016-06-32,我上面的原始查询会引发错误

答案 1 :(得分:0)

使用YEARMONTH代替LIKE

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

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

例如

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