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,我上面的原始查询会引发错误=])
使用YEAR
和MONTH
代替LIKE
WHERE
YEAR(OrderDate) = 2017 AND
MONTH(OrderDate) = 6
您可以使用下面的查询查看输出。你会看到问题的。
例如
SELECT CAST(OrderDate AS VARCHAR) -- May 27 2017 1:22AM
有一栏叫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,我上面的原始查询会引发错误=])
使用YEAR
和MONTH
代替LIKE
WHERE
YEAR(OrderDate) = 2017 AND
MONTH(OrderDate) = 6
您可以使用下面的查询查看输出。你会看到问题的。
例如
SELECT CAST(OrderDate AS VARCHAR) -- May 27 2017 1:22AM