【问题标题】:Calculate full years and partial months between 2 dates计算两个日期之间的整年和部分月份
【发布时间】:2019-11-14 20:52:17
【问题描述】:

我想知道如何计算两个日期之间的完整年数和完整月数并将它们合并为一列:

例如:我的开始日期是一个名为“TransferDate”的列 = 7/1/2017 和今天(11/14/2019)我想要的输出是一个名为“Age”的列 = 2.3

2 整年 (2017 - 2019) .3 整月(8 月、9 月和 10 月)

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。你如何定义“整月”? 2 月 28 日是 1 月 31 日之后的“整月”吗?
  • 您需要获取 TransferDate 之后的下个月第一天与当月第一天之间的日期差(以月为单位)。你如何做到这一点取决于你的语言/版本。
  • 按月计算是 2 月 28 日是 1 月 31 日之后的整月,它是“是”。也许最好说计算不应该考虑当前月份。这就是为什么我的示例计算只显示到 10 月而不是 11 月。我希望这是有道理的。我也没有要标记的数据库。我可以将月份 DATEDIFF(MONTH,TransferDate,GETDATE()) 设为“月份”,但我想要的输出比这更详细一些。感谢您的耐心等待
  • 如果相差 10 个月呢? 0.10 ?和 11 个月一样吗?
  • 相差11个月时,要输出x.11吗?

标签: sql datediff


【解决方案1】:

看看这是否能满足您的需求。

Declare @date1 date = '11/01/2001'
Declare @date2 date = '12/01/2002'

Select @date1
    ,@date2
    ,Case 
    when datediff(M,@date1,@date2) < 12 then ''
    when datediff(M,@date1,@date2) < 24  then 'one year'
    else cast(floor(datediff(M,@date1,@date2)/12) as varchar(20)) + ' Years'
    end  +  ' ' +
Case 
    when datediff(M,@date1,@date2) - floor(datediff(M,@date1,@date2)/12)*12 = 0  then ''
    when datediff(M,@date1,@date2) - floor(datediff(M,@date1,@date2)/12)*12 = 1 then 'one month'
    else cast(datediff(M,@date1,@date2) - floor(datediff(M,@date1,@date2)/12)*12 as varchar(20)) + ' Months'
    end

【讨论】:

  • 做到了!非常感谢!
【解决方案2】:

这会在将年和月组件计算为monthdif 和yeardif 之后将它们组合到一个列中。

DECLARE @start DATETIME = '07/01/2017'
DECLARE @end DATETIME = '11/14/2019'

select CAST((CAST(x.yeardif as nvarchar(20)) + '.' + CAST(x.monthdif as nvarchar(20))) as decimal(5,2)) from
(select DATEDIFF(yyyy,@start,@end) yeardif,DATEDIFF(m,@start,@end) - (12 * DATEDIFF(yyyy,@start,@end)) - 1 monthdif) x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2022-11-18
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    相关资源
    最近更新 更多