如何选择日期范围内的不同天数?

时间:2011-11-29 17:34:45

标签: tsql

我正在尝试使用T-SQL函数DATEDIFF来选择一段时间内不同日期的数量。

以下查询:

SELECT DATEDIFF(DAY, '2012-01-01 01:23:45', '2012-01-02 01:23:45')

选择1,这比我想要的少一个。该范围内有两个不同的日期:2012-01-01和2012-01-02。

在一般情况下向结果添加一个是不正确的。以下查询:

SELECT DATEDIFF(DAY, '2012-01-01 00:00:00', '2012-01-02 00:00:00')

选择1,这是正确的,因为范围内只有一个不同的日期。

我确信有一个简单的算术运算我想要计算它。有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

SELECT DATEDIFF(DAY, '2012-01-01 01:23:45', '2012-01-02 01:23:45') 

在这个例子中,它应该仍然是1,因为只有一天过去了。即使您正在考虑一天的开始,它仍然只有一个(因为此范围仅包括2012-01-02 00:00:00的开头)。

你的逻辑:

SELECT DATEDIFF(DAY, '2012-01-01 01:23:45', '2012-01-02 01:23:45') 

SELECT DATEDIFF(DAY, '2012-01-01 00:00:00', '2012-01-02 00:00:00') 

应该是相同的,在数学上它们是相同的范围。 DATEDIFF根据第一个参数的粒度进行比较。您按day进行比较,因此SQL Server会将2012-01-012012-01-02视为1天差异。

非常丑陋(在我看来,不好)的解决方法是这样的:

SELECT DATEDIFF(day, yourStartDate, dateadd(ss, -1, yourEndDate)) + 1

这样做可以处理包容性日期。所以你基本上可以这样:

SELECT DATEDIFF(DAY, '2012-01-01 01:23:45', dateadd(ss, -1, '2012-01-02 01:23:45')) + 1 

等于2和此:

SELECT DATEDIFF(DAY, '2012-01-01 00:00:00', dateadd(ss, -1, '2012-01-02 00:00:00')) + 1

等于1。我不认为这是世界上最好的主意,但它会给你你想要的输出。这一切都归结为商业逻辑。