sql - 如何计算两个日期之间的月数和天数,而不在 SQL Server 中返回负值
问题描述
我在大多数情况下都可以使用此 SQL 块,但是当结束日期的月/日大于开始日期的月/日时,我会返回负的“日”值。不太确定如何防止负日结果的发生,除了在结束月/日>开始月/日时捕获异常的情况下将其包装起来。
例如,如果开始日期为 2017 - 06 -05,结束日期为 2019 - 06 - 04,则输出为“24 个月零 -1 天”。
CONVERT ( VARCHAR ( MAX ),
DATEDIFF ( month , [Participant - Birthday] , [Event - Event Date] ) )
+ ' months and ' +
CONVERT ( VARCHAR ( MAX ) ,
DATEDIFF ( day , DATEADD ( month , DATEDIFF ( month , [Participant - Birthday] , [Event - Event Date] ) , [Participant - Birthday] ) , [Event - Event Date] ) )
+ ' days'
使用上述开始和结束日期的预期输出应为“23 个月零 30 天”。
解决方案
这是表达逻辑的另一种方式:
select s, e, v.num_months, datediff(day, dateadd(month, num_months, s), e)
from (values (convert(date, '2017-06-05'), convert(date, '2019-06-04')),
(convert(date, '2017-06-05'), convert(date, '2019-06-05')),
(convert(date, '2017-06-05'), convert(date, '2019-06-06'))
) t(s, e) cross apply
(values (case when day(s) <= day(e) then datediff(month, s, e) else datediff(month, s, e) - 1 end)) v(num_months);
这将计算到结束日期或之前的月差数。然后它计算结束日期和开始日期之间的天差加上该月数。
推荐阅读
- php - 如何在 laravel php 中从数据集编写子查询
- python - 如何将高音扬声器数据保存在 json 文件中?
- c# - 如何添加带参数值且不带 lambda 表达式的委托
- javascript - for 循环遍历 index[0] 两次
- python - 我需要创建一个 pandas 数据框,显示推文所代表的主题
- r - 将 data.frame 对象中的数值变量添加到包含 multpolygons 的 sf 对象
- spring - 使用 mongoDb(如 Firebase 或 Realtime Server 应用程序)的 Spring Boot
- javascript - 为什么我的反应应用程序中的后续警报会显示给定会话中显示的第一个警报中的“useCountdown 挂钩计时器”?
- php - 如何在 Wordpress 中使用新的 wp_query 实例
- reactjs - 如何使用 React hook 在 React Native 中使用 TextInput 更改对象数组的特定字符串?