sql-server - 将 DateTime 转换为 VARCHAR,然后使用 LIKE 时出现奇怪的结果

标签 sql-server sql-like

有一个名为 OrderDate 的列(数据如下: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' 将被转换为 DateTime,'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%'

另一个问题是,当您使用强制转换时,无法保证会输出哪种格式。如果您想要字符串输出,您应该使用 CONVERT 并指定输出格式。对于 ISO8601 格式,请执行此操作。

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

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

关于sql-server - 将 DateTime 转换为 VARCHAR,然后使用 LIKE 时出现奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43692210/

相关文章:

sql - 检索插入的最后一行 Uniqueidentifier,它不是 IDENTITY

sql - 合并连续的日期

.net - 使用 SQLBulkCopy - SQL Server 2016 中的表比 SQL Server 2014 中的表大得多

sql - 实现 "Like"功能

c# - Entity Framework 并加载所有数据库条目与根据需要加载每个数据库条目

SQL 日期值表示 "PRESENT"(截至今天的日期)

具有 2 个或更多参数的 Mysql LIKE 与 REGEXP

php - Like 在连接条件的更新查询中未按预期工作

sql - 返回第一个字符为非字母的行

ruby-on-rails - 使用 Rails 进行不区分大小写的 Postgres 搜索