Sql 为什么case语句在比较数据时失败?
我已将OpeningDate存储为varchar100,将OpeningTime存储为表中的时间 我尝试了所有方法,但这会导致错误: 从字符串转换日期和/或时间时,转换失败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字段中的某些数据可能不是有效的日期格式 运行此操作以获取可能存在问题的所有记录
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)