DATEDIFF与WEEK / MONTH给出不同的结果

时间:2014-07-08 09:42:22

标签: sql sql-server sql-server-2008

我想知道两个日期之间的差异。它看起来像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

如何获得正确的周/月差异?

4 个答案:

答案 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)

如果天数相同,则计为一个月,CASTBIT将每个数字减少为1。