sql-server - SQL Server 日期时间转换失败

标签 sql-server datetime

我有一张有 100 万多条记录的大表。不幸的是,创建表格的人决定将日期放在 varchar(50) 中。 field 。

我需要做一个简单的日期比较 -

datediff(dd, convert(datetime, lastUpdate, 100), getDate()) < 31

但它在 convert() 上失败了:
Conversion failed when converting datetime from character string.

好像那个领域有不喜欢的东西,而且记录这么多,光看也看不出来。如何正确清理整个日期字段,使其不会在 convert() 上失败?这是我现在拥有的:
select count(*)
from MyTable
where
    isdate(lastUpdate) > 0
    and datediff(dd, convert(datetime, lastUpdate, 100), getDate()) < 31

@SQLMenace

在这种情况下,我不关心性能。这将是一次查询。将表更改为日期时间字段不是一种选择。

@Jon Limjap

我已经尝试添加第三个参数,它没有任何区别。

@SQLMenace

The problem is most likely how the data is stored, there are only two safe formats; ISO YYYYMMDD; ISO 8601 yyyy-mm-dd Thh:mm:ss:mmm (no spaces)


isdate() 不会吗?检查照顾这个?

我不需要 100% 的准确率。我只想获取过去 30 天的大部分记录。

@SQLMenace
select isdate('20080131') -- returns 1
select isdate('01312008') -- returns 0

@Brian Schkerke

Place the CASE and ISDATE inside the CONVERT() function.



谢谢!做到了。

最佳答案

放置CASEISDATE里面CONVERT()功能。

SELECT COUNT(*) FROM MyTable
WHERE
    DATEDIFF(dd, CONVERT(DATETIME, CASE IsDate(lastUpdate)
        WHEN 1 THEN lastUpdate
        ELSE '12-30-1899'
    END), GetDate()) < 31

替换 '12-30-1899'使用您选择的默认日期。

关于sql-server - SQL Server 日期时间转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28110/

相关文章:

sql-server - Amazon RDS SQL Server 使数据库联机

使用 joda 日期时间的 Scala 日期时间转换

datetime - 夏令时 "bug"

c++ - 将 MYSQL 时间戳转换为 time_t

sql-server - 计算表中出现的次数

sql-server - SQL Server 在链接的 MS Access 表上插入后返回不同的记录

sql-server - 可以存储一个选择列的值并将其用于下一个选择列吗?

sql - SQL Server 是否具有与 Excel 的 KURT 功能等效的功能?

java - 查询两个日期之间的数据

c++ - 在 C++/boost 中将日期时间转换为不同的时区