我想知道两个日期之间的差异。它看起来像SQL服务器完成,并为我提供不同的结果。但我想计算他们是否越过7天,14天,21天。
我在数据库中存储了一周的差异,如1或2等。所以我想在没有圆整的情况下使用DATEDIFF和WEEK。
预期结果0,但返回1
SELECT DATEDIFF(WEEK, '2014-07-08 10:15:00', '2014-07-14 09:00:00'); --1
预期结果1,但返回2
SELECT DATEDIFF(WEEK, '2014-07-08 10:15:00', '2014-07-20 09:00:00'); --2
与MONTH同样的问题,下面的预期行为是0.但是给出1
SELECT DATEDIFF(MONTH, '2014-07-15 10:15:00', '2014-08-12 09:00:00') --1
如何获得正确的周/月差异?
答案 0 :(得分:2)
根据MSDN,DATEDIFF
“返回指定的startdate和enddate之间交叉的指定日期部分边界的计数(有符号整数)。”
在第一种情况下,datepart(week,'2014-07-08 10:15:00')
为28,datepart(week,'2014-07-14 09:00:00')
为29,因此您的结果应该是1。与其他案件类似。
我想您可以将日期时间值转换为bigint
,然后将差值除以7得到几周,如果这是你想要的,就像这样:
select (cast(@end as bigint) - cast(@start as bigint))/7
编辑:DATEDIFF
总是使用星期日作为一周的第一天,以确保功能是确定性的。
感谢@Serpiton提供此信息。
答案 1 :(得分:0)
您可以在DATEDIFF函数中尝试DAY而不是WEEK,然后除以7以获得完整的一周
SELECT DATEDIFF(DAY, '2014-07-08 10:15:00', '2014-07-20 09:00:00') / 7
答案 2 :(得分:0)
解决您的问题
SELECT DATEDIFF(DD, '2014-07-08 10:15:00', '2014-07-14 09:00:00')/7
SELECT DATEDIFF(DD, '2014-07-08 10:15:00', '2014-07-15 09:00:00')/7
SELECT DATEDIFF(DD, '2014-07-08 10:15:00', '2014-07-20 09:00:00')/7
SELECT DATEDIFF(DD, '2014-07-08 10:15:00', '2014-07-22 09:00:00')/7
答案 3 :(得分:0)
Kiran Hedge的回答涵盖了几个星期,你可以使用的几个月
declare @datestart datetime = '2014-07-09 10:15:00'
declare @datestop datetime = '2014-08-08 09:00:00'
SELECT DATEDIFF(MONTH, @datestart, @datestop)
- CAST(((DATEPART(DAY, @datestart))
/ (DATEPART(DAY, @datestop) + 1)) AS BIT)
如果天数相同,则计为一个月,CAST
至BIT
将每个数字减少为1。