【问题标题】:Number of full month (none partial) between 2 dates in SQLSQL 中 2 个日期之间的整月数(非部分)
【发布时间】:2015-07-30 21:30:55
【问题描述】:

如何在 SQL 中计算两个日期之间的整月(非部分)?结果应该如下:

开始日期 |结束日期 |整月
2015 年 5 月 2 日 | 2015 年 6 月 29 日 | 0
2015 年 5 月 1 日 | 2015 年 6 月 30 日 | 2
2015 年 5 月 1 日 | 2015 年 6 月 5 日 | 1
2015 年 5 月 31 日 | 2015 年 6 月 30 日 | 1
2015 年 2 月 1 日 | 2015 年 2 月 28 日 | 1
2015 年 2 月 27 日 | 2015 年 3 月 30 日 | 0
2015 年 2 月 27 日 | 2015 年 3 月 31 日 | 1

到目前为止我的代码:

Select startDate [Start Date],
endDate [End Date],
DATEDIFF(MM,startDate,endDate) + CASE
    WHEN DAY(endDate) =DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,endDate),0)))
    THEN 1 
    ELSE 0  
END - CASE
    WHEN DAY(startDate) = 1  
    THEN 0  
    ELSE 1  
END [Full Month]
FROM table

我需要在另一个多级嵌套 CASE 语句中使用它,因此尽可能避免使用额外的 CASE 语句

其他细节:

我正在为第三方软件编写报告,但并不总是相同的 RDBMS,主要是旧版本的 MS SQL Server。还希望报告本身的代码而不是存储在数据库中。

【问题讨论】:

  • 日期函数从一个RDBMS到下一个略有不同,所以请指定您使用的SQL数据库(和版本)。
  • 2/27 到 3/27、3/28、3/29、3/30 和 3/31 的结果是什么?

标签: sql date


【解决方案1】:

我会这样做:

SELECT 
    DATEDIFF(mm,startDate,endDate)-1 + 
    IIF(EOMONTH(endDate)=endDate, 1, 0) + 
    IIF(1=DAY(startDate), 1, 0)
AS full_months FROM dates;

http://sqlfiddle.com/#!6/be17e/14

http://sqlfiddle.com/#!3/be17e/3 (MSSQL Server 2008)

【讨论】:

  • 您的代码很好地了解了如何确定月末(MS SQL Server 2012 +)。否则与问题中的代码相同,不回答如何避免Case语句。
  • 啊,我误解了他的意思,以为他不想使用任何额外的案例陈述,而不是他已经在回答中的内容,只是更新以避免案例陈述
  • + 1. 好答案(MS SQL Server 2012 +)。仍在等待,看看是否有适合旧版本的好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 2021-04-05
  • 2021-07-20
相关资源
最近更新 更多