【问题标题】:Can I get a list of rows with varchar values that aren't castable to datetime?我可以获取不能转换为日期时间的 varchar 值的行列表吗?
【发布时间】:2010-10-31 08:35:30
【问题描述】:

我有一个旧版 SQL Server 2000 数据库,该数据库有一列的日期存储为 varchar 而不是 datetime,无论出于何种原因。我想查看这些数据并使用日期时间字段而不是 varchar 来更轻松地针对该字段进行报告。好消息是,大多数值看起来应该可以直接转换为日期时间。

当然,显然有些字段以无法转换为日期时间的方式输入。为清楚起见,表格如下所示:

CREATE TABLE dbo.user
(
    ...
    birthdate varchar(10)
    ...
)

视图可能如下所示:

CREATE VIEW dbo.UserView
AS
SELECT ...
       CAST(u.birthdate AS datetime) AS birthdate
       ...
FROM user u
WHERE ...

我有什么办法:

  1. 获取无法将生日日期转换为日期时间的所有行的列表,以防我修复它?
  2. 在我无法修复该值的情况下,让该值显示为 NULL 或什至可能是明显不是用户真实生日的值?

【问题讨论】:

    标签: sql-server datetime sql-server-2000 casting varchar


    【解决方案1】:

    使用IsDate()

    SELECT birthdate, ' ' _, *
    FROM user u
    WHERE IsDate(u.bithdate) != 1
    

    SELECT ...
       CAST(CASE WHEN IsDate(u.birthdate) = 1 THEN u.birthdate ELSE NULL END AS datetime) AS birthdate
       ...
    FROM user u
    WHERE ...
    

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        显示坏行:

        select * from dbo.user where isdate(birthdate)!=1
        

        你的看法:

        SELECT ...
            CASE
                WHEN isdate(birthdate)=1 THEN CAST(u.birthdate AS datetime)
                ELSE NULL
            END AS Birthday
               ...
        FROM user u
        WHERE ...
        

        【讨论】:

        • 这是一件小事,但在 !=1 而不是 =0 上的意义重大。虽然这个特定的函数总是返回 1 或 0,但许多函数会为 NULL 输入返回 NULL,并且专门测试成功结果是一个好习惯。
        • @Joel Coehoorn:NULL=0 也不是真的,所以没关系
        • @wqw - 第一个样本很重要。如果他写 =0 而不是 != 1 并且这是一个 NULL 变为 NULL 函数,则不会返回 NULL 记录。
        • “null!=1”和“null=0”都是假的。任何与 null 的比较都会评估为 false。
        • 仅供参考,isdate() 永远不会返回 NULL
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-07
        • 2021-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-20
        相关资源
        最近更新 更多