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 为什么case语句在比较数据时失败?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 为什么case语句在比较数据时失败?

Sql 为什么case语句在比较数据时失败?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我已将OpeningDate存储为varchar100,将OpeningTime存储为表中的时间 我尝试了所有方法,但这会导致错误: 从字符串转换日期和/或时间时,转换失败 我怀疑OpeningDate字段中的某些数据可能不是有效的日期格式 运行此操作以获取可能存在问题的所有记录 select * from works where isdate(OpeningDate) = 0 现在有一个答案被删除了——我的评论也随之删除了 有几个问题: 转换样式106表示dd-mon-yyyy。这是您需要

我已将OpeningDate存储为varchar100,将OpeningTime存储为表中的时间

我尝试了所有方法,但这会导致错误:

从字符串转换日期和/或时间时,转换失败


我怀疑OpeningDate字段中的某些数据可能不是有效的日期格式

运行此操作以获取可能存在问题的所有记录

select *
from works
where isdate(OpeningDate) = 0 

现在有一个答案被删除了——我的评论也随之删除了

有几个问题:

转换样式106表示dd-mon-yyyy。这是您需要的输出格式吗? 如果将值(如2018-04-02)转换为DATETIME,则这取决于区域性。 在字符串类型的列中存储日期值是个坏主意。这将减慢您的查询速度,并且是有害的。。。 试试这个:

SET LANGUAGE ENGLISH;
SELECT CAST('2018-04-02' AS DATETIME)

SET LANGUAGE GERMAN;
SELECT CAST('2018-04-02' AS DATETIME)
是四月二日还是二月四日

现在尝试同样的方法,直到目前为止

这有点奇怪,但这是一个遗产。。。使用新格式DATE、TIME和DATETIME2可以避免这种情况

另一个可靠的方法是ISO8601格式。这是yyyy-MM-ddTHH:MM:ss。在任何区域性中,您都可以将类似2018-04-02T12:32:45的字符串强制转换为DATETIME

当然也有可能出现2017年2月29日的2017-02-29之类的无效字符串!或者字符串列中的任何垃圾数据

您可以使用ISDATE搜索垃圾数据,请参见RegBes的答案

还有一个选项是从v2005开始用XML方法模拟TRY_CAST:

声明@SomeDates提交VARCHAR100; 在@SomeDates值“2018-04-02”、“2017-02-29”、“垃圾数据”中插入 选择TRY_CASTd AS DATE-需要v2012 ,TRY_CONVERTDATE,d,102-需要v2012并允许指定掩码102:yyyy.mm.dd ,为XML路径“x”选择d,键入 .value“/x/d/text[1]强制转换为xs:date?”,“datetime” 来自@SomeDates;
OpeningTimeTIME的数据类型是什么………您的查询适用于meRegBes的回答是一个很好的提示,您可能会阅读我在Chanukya回答下面关于文化相关日期/时间格式的评论。。。始终尝试使用适当的格式将数据保存在列中。对日期值使用字符串格式会减慢查询速度,而且是有害的——正如您所发现的……这是一个case表达式,而不是一个语句
SET LANGUAGE ENGLISH;
SELECT CAST('2018-04-02' AS DATETIME)

SET LANGUAGE GERMAN;
SELECT CAST('2018-04-02' AS DATETIME)