DateDiff SQL Server问题

时间:2009-11-13 12:56:54

标签: sql-server-2005

有人可以向我解释一下,因为我对这为什么会发生这种情况感到困惑吗?基本上我想知道的是为什么周日日期和本周的每隔一天之间存在差异,从0年起几周内。如果这是有意义的话。

我尝试先设置日期,但这没有效果。当然周一 - 本周日应该在几周内与零年相同?

Set Datefirst 1
Select DateName(dw,0) --Monday
Select DateDiff(week, 0, '20091109')--Monday: Difference 5732
Select DateDiff(week, 0, '20091114')--Saturday: Difference 5732
Select DateDiff(week, 0, '20091115')--Sunday: Difference 5733

更令人奇怪的是,如果你采用相同的两个日期和日期差异,那么你将获得一周的一周和另一天的一天。我在这里错过了什么吗?

Select DateDiff(dd,'20091109','20091115')--6 Days difference
Select DateDiff(ww,'20091109','20091115')--1 Week difference

我正在使用SQL Server 2005

4 个答案:

答案 0 :(得分:3)

周日被认为是许多国家/地区的一周中的第一天。

答案 1 :(得分:3)

所有的datediff函数都会计算传递给它的两个日期时间参数之间的日期 boundarys 。因此,如果将一周定义为星期日开始,则边界周是星期日星期日早晨。

所以,从星期六晚上11:59到星期日早上00:01,将是从周日00:01到11日的 相同的 datediff(week, x, y) :星期六晚上59点--13天后。

 x ------------------------------x    ==> 1 week diff
| Su M T W T F S | Su M T W T F S |
|                |                |
                x-x                   ==> Also 1 week diff

答案 2 :(得分:2)

我认为您面临的问题是边界日期。它们是包容性的吗?

Select DateDiff(dd,'20091109','20091115')--6 Days difference
Select DateDiff(dd,'20091109','20091116')--7 Days difference

DateDiff - 返回两个指定日期之间跨越的日期和时间边界的数量。 (图书在线定义)

答案 3 :(得分:1)

如果您设置Datefirst = 1,则星期一是一周的第一天,并且星期计算将使用MOD 7表示一周中的天数和/ 7表示星期计数,其中星期日将用作1,其他人都是0。