sql-server - 以月和日计算两个日期之间的时间段
问题描述
我目前正在使用以下代码来确定两个日期之间的时间段(以月和日为单位):
DECLARE @date1 DATETIME = '2009-01-01 00:00:00'
DECLARE @date2 DATETIME = '2010-06-30 00:00:00'
SELECT CAST(DATEDIFF(mm, @date1, @date2) AS VARCHAR(6)) + ' Months ' + CAST(DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, @date1, @date2), @date1), @date2) AS VARCHAR(2)) + ' Days'
这个问题是代码似乎没有计算最后一天,所以上面返回 17 个月 29 天,而我需要的返回是 18 个月。
同样如下:
DECLARE @date1 DATETIME = '2020-01-01 00:00:00'
DECLARE @date2 DATETIME = '2020-01-31 00:00:00'
SELECT CAST(DATEDIFF(mm, @date1, @date2) AS VARCHAR(6)) + ' Months ' + CAST(DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, @date1, @date2), @date1), @date2) AS VARCHAR(2)) + ' Days'
返回 0 个月 30 天而不是 1 个月。
有没有办法修改上述内容以识别天数等于一个月的整个月份并计算最后一天?
谢谢
解决方案
您必须将一天(使用DATEADD
)添加到第二个日期(@date2
):
-- first example
DECLARE @date1 DATETIME = '2009-01-01 00:00:00'
DECLARE @date2 DATETIME = '2010-06-30 00:00:00'
SELECT CAST(DATEDIFF(mm, @date1, DATEADD(DAY, 1, @date2)) AS VARCHAR(6)) + ' Months ' + CAST(DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, @date1, DATEADD(DAY, 1, @date2)), @date1), DATEADD(DAY, 1, @date2)) AS VARCHAR(2)) + ' Days'
-- second example
DECLARE @date1 DATETIME = '2020-01-01 00:00:00'
DECLARE @date2 DATETIME = '2020-01-31 00:00:00'
SELECT CAST(DATEDIFF(mm, @date1, DATEADD(DAY, 1, @date2)) AS VARCHAR(6)) + ' Months ' + CAST(DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, @date1, DATEADD(DAY, 1, @date2)), @date1), DATEADD(DAY, 1, @date2)) AS VARCHAR(2)) + ' Days'
请看以下示例:
DATEDIFF
和为 0。 (2020-01-01
和之间的最大差异等于 0 天、23 小时、59 分钟和 59 秒。2020-01-01
2020-01-01 00:00:00
2020-01-01 23:59:59
DATEDIFF
和是 1。 (2020-01-01
和之间的最大差异等于 1 天 23 小时 59 分 59 秒。2020-01-02
2020-01-01 00:00:00
2020-01-02 23:59:59
因此,由于这一天还没有结束,因此您不能将最后一天算作差异中的一天。
推荐阅读
- ckeditor5 - ckeditor5 - Angular 7 图像对齐
- pcap - nmap 与 tcpreplay 问题一起使用
- java - 在 spring-boot spa 应用程序中保留 swagger-ui.html
- python - pandas python中的多索引
- haskell - 如何停止 GHCi 中的无限评估?
- python - 如何获取除魔术方法/属性之外的已定义类属性的字典?
- request - Life Cycle Http请求模式集成IIS
- python-3.x - 如何使用 pandas group by 进行基于逻辑的过滤
- c++ - 在不改变值和性能的情况下多次访问位域?
- terraform - 如何在 Azure 中配置 Terraform