【问题标题】:Need to calculate difference of days between joining date and today's date in year,month and days format需要以年月日格式计算加入日期与今天日期的天差
【发布时间】:2017-07-17 12:05:55
【问题描述】:

我有一个名为 Dates 的表

Opendate        Closedate       
2016-02-26      NULL    
2017-01-01      NULL    
2015-11-11      NULL    

我希望输出为

Opendate    Workingperiod       
2016-02-26  1 years 0 months 1 days         
2017-01-01  0 years 1 months 26 days     
2015-11-27  1 years 3 months 0 days     

我们需要计算opendate和今天的日期之间的差异,并以年月日格式计算。

是否有任何输入 any1 可以共享。

【问题讨论】:

  • 这是 SQL Server 的一大痛点。

标签: sql sql-server-2008


【解决方案1】:
CREATE TABLE Dates(Opendate DATE, CloseDate DATE)

INSERT INTO Dates(Opendate, CloseDate) values('2016-02-26', null),('2017-01-01',null),('2015-11-11',null)

SELECT Opendate,
       CASE WHEN DAY(Opendate)>DAY(GETDATE()) THEN 
         CAST(DATEDIFF(month,Opendate,GETDATE())/12 AS VARCHAR(5))+' year '+
         CAST((DATEDIFF(month,Opendate,GETDATE())%12-1) AS VARCHAR(5)) +' month '+
         CAST(DATEDIFF(day,DATEADD(month,DATEDIFF(month,Opendate,GETDATE())-1,Opendate),EOMONTH(DATEADD(month,-1,GETDATE())))+DAY(GETDATE()) AS VARCHAR(5))+' days ' 
         ELSE
           CAST(DATEDIFF(month,Opendate,GETDATE())/12 AS VARCHAR(5))+' year '+
           CAST(DATEDIFF(month,Opendate,GETDATE())%12 AS VARCHAR(5)) +' month '+
           CAST(DATEDIFF(day,DATEADD(month,DATEDIFF(month,Opendate,GETDATE()),Opendate),GETDATE()) AS VARCHAR(5))+' days '
       END AS 'Workingperiod'     
  FROM Dates

以上是我的脚本,希望对你有用。

【讨论】:

  • 感谢@victor,它就像一个魅力。
  • Victor 我的代码有 1 个问题,当我的加入日期是 2014-06-02 00:00:00 时,我的输出是 2 年 9 个月 -1 天。我的日子是消极的
  • oh...Red 我没有考虑 DAY(Opendate) 大于 DAY(当前日期) 的另一个条件。现在我们应该使用 SQL Server 2012 支持的 EOMONTH() 函数。更新了我的答案。
  • 维克多,但我使用的是 sql2008
  • Msg 195, Level 15, State 10, Line 11 'EOMONTH' 不是可识别的内置函数名称。
【解决方案2】:

我认为这应该可行 - 一些组合日期算术(我添加 CURRENT_DATE 以显示我们正在计算的内容); WITH 子句只是您显示的输入。

WITH
input(Opendate,Closedate) AS (
          SELECT DATE '2016-02-26',NULL
UNION ALL SELECT DATE '2017-01-01',NULL
UNION ALL SELECT DATE '2015-11-11',NULL
)
SELECT 
  GETDATE( ) AS current_date
, Opendate
, CAST(DATEDIFF(MONTH, Opendate,GETDATE( )) / 12 AS VARCHAR(3)) + ' years '
+ CAST(DATEDIFF(MONTH, Opendate,GETDATE( )) % 12 AS VARCHAR(3)) + ' months '
+ CAST(
    DATEDIFF(
      DAY
    , Opendate
    , DATEADD(
        MONTH
      , DATEDIFF(MONTH, Opendate,GETDATE( )) * -1
      , GETDATE( )
      )
    ) 
  AS VARCHAR(3)
  ) + ' days'
AS WorkingPeriod
FROM input;

current_date|Opendate  |WorkingPeriod
2017-02-26  |2016-02-26|1 years 0 months 0 days
2017-02-26  |2017-01-01|0 years 1 months 25 days
2017-02-26  |2015-11-11|1 years 3 months 15 days

【讨论】:

  • Msg 156, Level 15, State 1, Line 11 关键字'CURRENT_DATE'附近的语法不正确。
  • 无法针对 SQL Server 对其进行测试,令我惊讶的是 SQL Server 甚至不支持 ANSI 标准 CURRENT_DATE 伪列。而是GETDATE()。我编辑了我的答案。
  • Msg 102, Level 15, State 1, Line 10 '|' 附近的语法不正确。
  • 好的。 SQL Server 中的连接运算符也很奇怪,而不是 ANSI。这是+ 符号而不是双杠。改变了答案。
  • Msg 195, Level 15, State 10, Line 11 'MOD' 不是可识别的内置函数名称。
猜你喜欢
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 2018-04-24
  • 1970-01-01
  • 2015-07-24
  • 2016-11-11
  • 2019-07-10
相关资源
最近更新 更多