【问题标题】:How can I convert this INT field to a usable date field?如何将此 INT 字段转换为可用的日期字段?
【发布时间】:2013-08-19 16:59:38
【问题描述】:

我正在使用的数据库将它们的日期值存储为INT。我需要确定两个 date 字段之间的日期差异,但我不确定如何处理这个问题,因为它们目前是 INT

日期存储如下:20130101 - YYYYDDMM。执行 DATEDIFF 会导致算术溢出错误。

关于如何转换两个 date 字段或查找它们之间的日期差异的任何想法?

【问题讨论】:

    标签: tsql sql-server-2005 type-conversion


    【解决方案1】:
    Select Cast( Cast( 20130101 As varchar(8) ) As datetime )
    

    因此,如果您有以下两个值:2013010120130201,我们可能会执行以下操作:

    Select DateDiff( d
        , Cast( Cast( 20130101 As varchar(8) ) As datetime )
        , Cast( Cast( 20130201 As varchar(8) ) As datetime ) )
    

    更新

    如果您的值小于17530101(日期时间的最小值),那么您将需要使用 Case 表达式在处理数据时对其进行验证。在这种情况下,使用Cast(0 As datetime) 将导致1900-01-01 作为我们的最小日期值。

    Select DateDiff( d
        , Case
            When Value1 <= 19000101 Then Cast(0 As datetime)
            Else Cast( Cast( Value1 As varchar(8) ) As datetime )
            End
        , Case
            When Value2 <= 19000101 Then Cast(0 As datetime)
            Else Cast( Cast( Value2 As varchar(8) ) As datetime )
            End )
    

    如果要将日期存储为所示的整数,更好的方法是更正数据并添加检查约束以防止值低于1900-01-01。如果您的合法值低于1900-01-01,则需要对解决方案进行另一次调整。

    【讨论】:

    • 我在尝试上面的DateDiff代码时发现,对于其中一个字段,输入INT,转换成功;但是,对于其他字段,相同的数据类型,我收到“将日期时间转换为字符串时转换失败”消息。
    • 我想知道这是否可能是因为,对于当前错误的字段,数据中存在许多 0 值;而对于正确工作的字段转换,所有值都包含一个日期。
    • 你能发布你使用的代码,以及列的值吗?上面的代码不会尝试将日期时间转换为字符串。
    • 哦,消息可能是“从”而不是“到”。是的,那会失败。您需要过滤掉那些(0 值)行,或者决定如何处理 0 值(可以使用 CASE 表达式来完成)。
    • @Gryphoenix - 0 应该代表什么日期值? 19000101?显然,一种解决方案是添加并强制执行一个检查约束,以防止早于 19000101 的内容被输入此列。除此之外,您将不得不使用 Case 表达式。将更新我的帖子来说明。
    猜你喜欢
    • 1970-01-01
    • 2017-10-01
    • 2018-05-07
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多