【问题标题】:How do I convert a timespan into years, months and days in sql如何在sql中将时间跨度转换为年、月和日
【发布时间】:2019-01-29 12:57:43
【问题描述】:

我使用以下语法得到两个日期之间的差异:

DATEDIFF(minute, [Dam_Date_Of_Birth], [Calf_Date_Of_Birth]) as [minutes]

这个查询给了我以下结果:

minutes
1748160
3711420
768960
4231380
5816779

如何将这些值转换为年、月、日格式?

【问题讨论】:

  • year, month, day format 是什么意思,能举个例子吗
  • 你的意思是x分钟为'x年y月z天'?
  • @RhysJones,确切地说。
  • @GarethD,我有开始和结束日期。因此,是否有可能获得两个日期之间的年、月和日数?
  • @PeetvdWesthuizen,是的,抱歉,我重新阅读了这个问题并删除了我的评论。再次道歉。

标签: sql-server tsql


【解决方案1】:

你也可以这样做

DECLARE @diff float = 1748160 / 24.0 / 60.0
Declare @date datetime = convert(datetime, @diff);
Select DatePart(yy, @date) - 1900 as Years, DatePart(mm, @date) - 1 Months, DatePart(dd, @diff) - 1 Days

或者您可以简单地将分钟数添加到“1900 年 1 月 1 日”并获得相同的结果,如下所示:

Declare @date datetime = DateAdd(minute, 1748160, '1 Jan 1900');
Select DatePart(yy, @date) - 1900 as Years, DatePart(mm, @date) - 1 Months, DatePart(dd, @date) - 1 Days

所以你可以这样使用:

DECLARE @dtStartDate date = '01 Jan 2015'
DECLARE @dtEndDate date = '11 Jan 2015'
Declare @date datetime = DateAdd(minute, DATEDIFF(minute, @dtStartDate, @dtEndDate), '1 Jan 1900');
Select DatePart(yy, @date) - 1900 as Years, DatePart(mm, @date) - 1 Months, DatePart(dd, @date) - 1 Days

【讨论】:

    【解决方案2】:

    参考this

    DECLARE @nMonth INT, @nYear INT, @mm INT, @dd INT, @getdd int
    DECLARE  @dtStartDate AS DATETIME, @dtEndDate AS datetime
    
    SET @dtStartDate = '01/01/2015'
    SET @dtEndDate = '02/11/2015'
    SET @nYear = DATEDIFF(yy, @dtStartDate, @dtEndDate)
    SET @mm = DATEDIFF(mm, @dtStartDate, @dtEndDate)
    SET @dd = DATEDIFF(dd, @dtStartDate, @dtEndDate)
    SET @nMonth = ABS(DATEDIFF(mm, DATEADD(yy, @nYear, @dtStartDate), @dtEndDate))
    SET @getdd = ABS(DATEDIFF(dd, 
                              DATEADD(mm, 
                                      DATEDIFF(mm, 
                                               DATEADD(yy, @nYear, @dtStartDate), 
                                               @dtEndDate), 
                                      DATEADD(yy, @nYear, @dtStartDate)), 
                              @dtEndDate))
    
    SELECT  Convert(varchar(10),@nYear) + ' year ' + 
            Convert(varchar(10),@nMonth) + ' month '  + 
            Convert(varchar(10),@getdd) + ' day(s)'
    

    输出: 0 year 1 month 10 day(s)

    【讨论】:

      【解决方案3】:

      366天解决问题:

      declare @st_date date = '2318-01-01';
      declare @end_date date = '2417-12-31';
      select datepart(yyyy,dateadd(year,(year(@st_date))%4+((year(@st_date)+100)%400/100)*100,cast(0 as datetime)) + datediff(day,@st_date,@end_date) ) - 
      (1900+(year(@st_date))%4+(((year(@st_date)+100)%400/100)*100)) as year
      ,datepart(mm,dateadd(year,(year(@st_date))%4+((year(@st_date)+100)%400/100)*100,cast(0 as datetime)) + datediff(day,@st_date,@end_date) ) - 1 as month
      ,datepart(dd,dateadd(year,(year(@st_date))%4+((year(@st_date)+100)%400/100)*100,cast(0 as datetime)) + datediff(day,@st_date,@end_date) ) - 1 as day
      输出 99 year 11 month 30 day

      总月:

      select (datepart(yyyy,dateadd(year,(year(@st_date))%4+((year(@st_date)+100)%400/100)*100,cast(0 as datetime)) + 
      datediff(day,@st_date,@end_date) ) - (1900+(year(@st_date))%4+(((year(@st_date)+100)%400/100)*100))) * 12 +
      datepart(mm,dateadd(year,(year(@st_date))%4+((year(@st_date)+100)%400/100)*100,cast(0 as datetime)) + 
      datediff(day,@st_date,@end_date) ) - 1 as totalmonth
      输出 1199 totalmonth

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多