Sql server 将DateTime强制转换为VARCHAR时会产生奇怪的结果,然后使用
有一个名为Sql server 将DateTime强制转换为VARCHAR时会产生奇怪的结果,然后使用,sql-server,sql-like,Sql Server,Sql Like,有一个名为OrderDate的列(数据如下:2007-06-02 00:00:00.000) 我试着在2007-06年与约会,比如: WHERE OrderDate LIKE '2007-06%' 但是什么也得不到。 然后我试着投下: WHERE CAST(OrderDate AS VARCHAR) LIKE '2007-06%' 还是一无所获。 有人帮我吗?我只是想用我喜欢的方式来做这件事 另外,其中OrderDate(如“%2007%”)可以从2007年开始获取数据,但“2007%”什么
OrderDate的列(数据如下:2007-06-02 00:00:00.000)
我试着在2007-06年与约会,比如:
WHERE OrderDate LIKE '2007-06%'
但是什么也得不到。
然后我试着投下:
WHERE CAST(OrderDate AS VARCHAR) LIKE '2007-06%'
还是一无所获。
有人帮我吗?我只是想用我喜欢的方式来做这件事
另外,其中OrderDate(如“%2007%”)可以从2007年开始获取数据,但“2007%”什么都没有。
SQL中的新启动程序。
谢谢
另一个问题是不能保证在使用cast时输出哪种格式。如果需要字符串输出,应使用CONVERT并指定输出格式。对于ISO8601格式,您可以这样做
WHERE CONVERT(VARCHAR(10), OrderDate, 126) LIKE '2007-06%'
同样,我真的不推荐这种方法。最好的情况是,如果数据上有任何索引,它将忽略它们,从而使查询速度非常慢。最坏的情况是,您使用不正确的日期时间比较字符串在查询中出错,但由于它被视为varchar,因此从未被捕获(正如我上面的原始查询一样,如果您尝试2016-06-32
),则会出现错误)使用年和月而不是像那样使用
WHERE
YEAR(OrderDate) = 2017 AND
MONTH(OrderDate) = 6
您可以通过下面的查询查看输出。你会发现问题所在
例如
对不起,算了吧。SQL Server 2012。非常感谢。我知道它与>=和<一起工作,我只是不明白为什么我不能转换成字符串并使用LIKE。此外,OrderDate(如“%2007%”)可以在2007年获得数据,但“2007%”什么也得不到。为什么会这样?@IanJay-请看我的编辑,简而言之,您缺少varchar的长度。谢谢。我在SSMS中尝试过,CAST(OrderDate作为VARCHAR)会出现类似于“2007年7月4日…”的内容,而不会出现类似于“2007-06%”的内容。还有我要研究的索引。非常感谢。@IanJay-请参阅更新,使用CONVERT而不是CAST来指定输出格式,这可以保证ISO8601输出格式。非常感谢。是的,我看到CAST(OrderDate作为VARCHAR)转到(Jul…)。但你能解释一下为什么像“%2007%”这样的OrderDate可以在2007年获得数据,而像“2007%”这样的OrderDate什么都没有吗?我知道了。CAST(OrderDate作为VARCHAR)进入“2007年7月4日…”,它与“%2007%”一起进入,但与“2007%”不一起进入。如果您的输出2007年7月4日
,那么这将像“%2017%”一样工作而不是'2017%
WHERE CONVERT(VARCHAR(10), OrderDate, 126) LIKE '2007-06%'
WHERE
YEAR(OrderDate) = 2017 AND
MONTH(OrderDate) = 6
SELECT CAST(OrderDate AS VARCHAR) -- May 27 2017 1:22AM