Sql 带有周/月的DATEDIFF给出了不同的结果

Sql 带有周/月的DATEDIFF给出了不同的结果,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我想知道两个日期之间的周差。看起来SQLServer完成了四舍五入,为我提供了不同的结果。但我想计算他们是否跨越了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-

我想知道两个日期之间的周差。看起来SQLServer完成了四舍五入,为我提供了不同的结果。但我想计算他们是否跨越了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
月份也存在同样的问题,低于的预期行为为0。但给出1

 SELECT DATEDIFF(MONTH, '2014-07-15 10:15:00', '2014-08-12 09:00:00')  --1

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

您可以尝试在DATEDIFF函数中使用DAY而不是week,然后除以7得到完整的一周

SELECT DATEDIFF(DAY, '2014-07-08 10:15:00', '2014-07-20 09:00:00') / 7

根据MSDN,
DATEDIFF
“返回指定的开始日期和结束日期之间交叉的指定日期部分边界的计数(带符号整数)。”

在第一种情况下,
datepart(周,'2014-07-08 10:15:00')
是28,
datepart(周,'2014-07-14 09:00:00')
是29,因此结果应该是1。其他情况也是如此

我想您可以将日期时间值转换为
bigint
,然后将差值除以7得到周,如果这是您想要的,如下所示:

select (cast(@end as bigint) - cast(@start as bigint))/7
编辑:
DATEDIFF
始终使用星期日作为一周的第一天,以确保函数具有确定性


感谢@Serpiton提供此信息。

您问题的解决方案

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

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
to
BIT
将每个数字减少为1。

但是如果我处理的是月,而不是周,是否需要除以30/31/28?`SELECT DATEDIFF(month,'2014-07-15 10:15:00','2014-08-12 09:00:00')也会给出1。如何处理这个问题。问题是您希望如何返回,您希望以30/31/28天作为月份,还是从日期到日期跨越一个完整的月份。例如,1月15日到3月15日,如果返回1,因为只有2月是范围内的完整月份,但是,如果我们从日期的角度来看,它是2。在MSDN的页面上,您可能需要添加一个小注释:
DATEDIFF
始终使用星期天作为一周的第一天,以确保函数是确定的。那么我的问题的解决方案是什么呢?
选择cast('2014-07-08 10:15:00'作为bigint')cast(“2014-07-1409:00:00”作为bigint)/7
给出将数据类型varchar转换为bigint时出现的
错误,这是因为您向其传递的是文本字符串,而不是类型为
datetime
的变量。我假设您的实际列/变量属于
datetime
类型?如果不是,我建议您首先将它们设置为
datetime
类型。
Declare@sd smalldatetime=>2014-07-08 10:15:00';声明@ed smalldatetime='2014-07-14 09:00:00';选择cast(@sd as bigint)-cast(@ed as bigint)/7
给出结果为35850。.这个数字首先是什么?我期望0:(…我的意思是0周你可以看看这个类似的问题?
选择DATEDIFF(月份,'2014-07-15 10:15','2014-08-15 09:00:00')-(日期部分)(日期,'2014-07-15 10:15:00')/DATEPART(日期,'2014-08-15 09:00:00'))
它没有给出1:(