不幸的是,我遇到了一个将日期存储为varchar而不是datetime的数据库。 它存储MULTIPLE日期格式(例如xx / yy / zzzz,xx / yy / zz,x / y / zzzz等)。最终,我希望将它们全部转换为xx / yy / zzzz。
我正在尝试进行一些数据清理并尝试使用一些SELECT语句来查看可以转换为什么内容。
SET DATEFORMAT DMY
SELECT MyDate, CAST(MyDate AS DATETIME) AS MyDate_Mod FROM MyTable
WHERE ISDATE(MyDate) <> 0 AND MyDate NOT LIKE '__/__/____'
这似乎执行正常。
下一个目标是找到年份大于2000的日期,因为一些2位数年份的CAST(例如xx / yy / zz)会自动转换为20zz而不是19zz。 无论如何所以我将SELECT更新为:
SELECT MyDate, CAST(MyDate AS DATETIME) AS MyDate_Mod FROM MyTable
WHERE ISDATE(MyDate) <> 0 AND MyDate NOT LIKE '__/__/____' AND YEAR(CAST(MyDate AS DATETIME)) >= 2000
运行上述语句因转换问题而失败。
也许我认为执行顺序很重要因为WHERE语句中的CAST可能在ISDATE&lt;&gt;之前执行了0
修改声明:
SELECT * FROM (SELECT MyDate, CAST(MyDate AS DATETIME) AS MyDate_Mod FROM MyTable
WHERE ISDATE(MyDate) <> 0 AND MyDate NOT LIKE '__/__/____') AS Sub
WHERE YEAR(Sub.MyDate_Mod) >= 2000
这也失败了。
有人可以向我解释为什么它会失败,如果它正在寻找有效的ISDATE(MyDate)?
答案 0 :(得分:1)
仍然不允许评论(但将其视为一个)。对于第三个查询,你尝试了类似的东西:
SELECT Top 10 Sub.*, Datepart(year,Sub.MyDate_Mod)
FROM
(SELECT MyDate, CAST(MyDate AS DateTime) AS MyDate_Mod
FROM MyTable
WHERE ISDATE(MyDate) <> 0 AND MyDate NOT LIKE '__/__/____') AS Sub
这只是为了看看你是否得到任何结果或是否总是抛出错误。如果它工作,那么尝试将其移动到WHERE子句。