Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将DateTime强制转换为VARCHAR时会产生奇怪的结果,然后使用_Sql Server_Sql Like - Fatal编程技术网

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