【问题标题】:Calculate month count between two date in SQL [duplicate]计算SQL中两个日期之间的月数[重复]
【发布时间】:2020-01-06 11:18:10
【问题描述】:

对于所有可能的情况,答案都应该是正确的。下面我写了一些可能的场景。

例如 -

  1. 2012-12-31 和 2013-02-28 之间的月份数 答案应该是 - 2

  2. 2019-01-31 和 2019-03-01 之间的月份数 答案应该是 - 1

【问题讨论】:

    标签: sql sql-server monthcalendar


    【解决方案1】:

    一种简单易行的方法,只需将此示例 SQL 复制并粘贴到 MSSQL 并执行即可。 如果需要,您可以使用此代码创建一个函数并执行。

    DECLARE @StartDate DATE = '2019-01-31'
    DECLARE @EndDate DATE = '2019-02-28'
    
    SELECT
       DATEDIFF(MONTH, @StartDate, @EndDate)+
       (CASE
        WHEN FORMAT(@StartDate,'yyyy-MM') != FORMAT(@EndDate,'yyyy-MM') AND 
          DATEPART(DAY,@StartDate) > DATEPART(DAY,@EndDate) AND 
          DATEPART(DAY,@EndDate) = DATEPART(DAY,EOMONTH(@EndDate)) THEN 0
    
        WHEN FORMAT(@StartDate,'yyyy-MM') != FORMAT(@EndDate,'yyyy-MM') AND 
          DATEPART(DAY,@StartDate) > DATEPART(DAY,@EndDate) THEN -1 
    
        ELSE 0 END) AS NumberOfMonths
    

    【讨论】:

    • 问题中的样本数据,和你这里使用的开始日期不一样。当DATEDIFF(MONTH,' 20121231','20130228') 已经返回2 时,为什么还需要CASE 表达式?
    • 您在 the same answer 上发布了关于此问题已作为副本关闭的问题。不要复制答案,而是标记以将问题作为重复项关闭。
    • @Larnu 因为没有大小写表达式,我们在某些情况下会得到错误的答案。例如 - 请检查。 2019 年 1 月 31 日和 2019 年 3 月 1 日。
    • 你在你的“问题”@ShehanSilva , 2012-12-31 和 2013-02-28 中给出了 一个 的例子,并说答案应该是 2。DATEDIFF(MONTH,' 20121231','20130228')返回2。您在“问题”中没有提供有关所需逻辑或目标的更多详细信息;所以DATEDIFF(MONTH... 完成了你指定的工作。
    • @Larnu。但是当我们为问题提供解决方案时,我们应该调查他们面临的实际问题是什么。为此,我们应该考虑所有可能的情况,并且对于所有可能的情况,答案应该是正确的。否则没有必要发布答案,用户可能会误导。我已经发布了这个答案 bcz 我已经针对所有可能的情况深入测试了此代码。谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-07-20
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    相关资源
    最近更新 更多