【问题标题】:Converting DateDIF in Excel to SQL DateDiff将 Excel 中的 DateDIF 转换为 SQL DateDiff
【发布时间】:2014-12-08 23:28:47
【问题描述】:

Excel公式: =DATEDIF(I2,TODAY(),"y")&"年"&DATEDIF(I2,TODAY(),"ym")&"月"&DATEDIF(I2,TODAY(),"md")&"天"

格式如下: 2年9个月6天

希望在 SQL 查询中使用它。

想法?

【问题讨论】:

  • 您使用的是哪个 DBMS? “SQL”只是一种查询语言,而不是 DBMS 产品。在标准 SQL 中,这将是 current_timestamp - i2(这将返回一个 interval 数据类型)。

标签: sql datediff


【解决方案1】:

在 TSQL 中你可以写成:

-- In case your date column has time also use Datetime for @I2 instead
DECLARE @I2 AS DATE
SET @I2 = '11/9/2014'

-- In TSQL GETDATE() returns current date and time
SELECT CAST (
               DATEDIFF(YY,@I2,GETDATE()) 
               - CASE WHEN (MONTH(@I2) > MONTH(GETDATE())) 
                             OR (MONTH(@I2) = MONTH(GETDATE())
                            AND DAY(@I2) > DAY(GETDATE())) 
                 THEN 1 ELSE 0 END
               AS VARCHAR(4)
            )  +' Years ' +       
       CAST (
               datediff(month, @I2, GETDATE()) 
               - CASE WHEN DAY(@I2) > DAY(GETDATE()) 
                 THEN 1 ELSE 0 END
                AS VARCHAR(4)
             ) +' Months ' +
         CAST(
              DATEDIFF(d, 
                  DATEADD(m, 
                  datediff(month, @I2, GETDATE()) 
                  - CASE WHEN DAY(@I2) > DAY(GETDATE()) 
                  THEN 1 ELSE 0 END
                  , @I2)
                , GETDATE())
               AS VARCHAR(4)
             ) +' Days ' 

【讨论】:

  • 这让我非常接近......它显示为示例:2 年 26 个月 22 天
【解决方案2】:

编辑:看起来 excel 实际上是 have a bug!

警告:Excel 提供 DATEDIF 函数以支持来自 Lotus 1-2-3 的旧工作簿。在某些情况下,DATEDIF 函数可能会计算出不正确的结果。有关详细信息,请参阅本文的已知问题部分。

对于它的价值,我不得不稍微调整一下以使其按预期工作。下面的工作 99% 的时间,但据我所知,可以在 1-3 天内关闭。我运行了 1500 多个单元测试,只有 15 个在该范围内失败。

例如,1973 年 12 月 31 日至 2019 年 12 月 5 日这一日期范围相差 1 天。要么,要么excel有bug!

SELECT CAST (
              DATEDIFF(YY,@I2,GetDate()) 
               - CASE WHEN (MONTH(@I2) > MONTH(GetDate())) 
                             OR (MONTH(@I2) = MONTH(GetDate())
                            AND DAY(@I2) > DAY(GetDate())) 
                 THEN 1 ELSE 0 END
               AS VARCHAR(4)
            )  + ' Years ' +
       CAST (
               datediff(month, @I2, GetDate()) 
               - CASE WHEN DAY(@I2) > DAY(GetDate()) 
                 THEN 1 ELSE 0 END
                 -
                 (DATEDIFF(YY,@I2,GetDate()) 
               - CASE WHEN (MONTH(@I2) > MONTH(GetDate())) 
                             OR (MONTH(@I2) = MONTH(GetDate())
                            AND DAY(@I2) > DAY(GetDate())) 
                 THEN 1 ELSE 0 END) * 12
                AS VARCHAR(4)
             ) + ' Months ' +
         CAST(
              DATEDIFF(d, 
                  DATEADD(m, 
                  datediff(month, @I2, GetDate()) 
                  - CASE WHEN DAY(@I2) > DAY(GetDate()) 
                  THEN 1 ELSE 0 END
                  , @I2)
                , GetDate())
               AS VARCHAR(4)
             ) + ' Days '

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    相关资源
    最近更新 更多