将Excel中的DateDIF转换为SQL中的DateDiff。

问题描述 投票:2回答:2

Excel公式:=DATEDIF(I2,TODAY(), "Y")&" 年"&DATEDIF(I2,TODAY(), "Ym")&" 月"&DATEDIF(I2,TODAY(), "MD")&" 天"

格式为:2年9个月6天

想在SQL查询中得到这个。

有什么想法?

sql datediff
2个回答
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 ' 

0
投票

EDIT: 看来excel也是这样做的,事实上。有毛病!

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

就其价值而言,我不得不对我的函数进行了一些调整,以使其按预期工作。下面的工作99%的时间,但据我所知,可能会有1-3天的偏差。我跑了1500多个单元测试,只有15个在这个范围内失败。

例如,这个日期范围12311973-1252019就偏离了一天。要么就是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 '
© www.soinside.com 2019 - 2024. All rights reserved.