2011-11-29 73 views
1

我正在嘗試使用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,這是正確的,因爲僅存在一個範圍不同日期。

我確定有一個簡單的算術運算,我錯過了計算這個。有人能幫我嗎?

+0

林不知道我明白你爲什麼認爲第二個查詢不應該返回'1'。您需要明確時間元素對結果的影響方式。 – Thomas

+0

@Thomas - 我想你誤解了我。第二個查詢確實並且應該返回'1'。第一個查詢返回'1',但我希望它返回'2'。 –

+0

爲什麼第一個應該返回2?這種情況怎麼樣:'DATEDIFF(DAY,'2012-01-01 00:00:00','2012-01-02 00:00:01')'。是否需要兩個日期時間值之間的24小時時間段數? – Thomas

回答

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。我不認爲這是世界上最好的想法,但它會給你你想要的結果。這一切都歸結爲業務邏輯。

+0

我意識到當我使用'DATEDIFF'函數時,SQL Server的行爲是一致的。也許我需要使用不同的功能。如何讓SQL Server計算範圍內不同日期值的數量?在我的第一個示例中,不同的日期值是2012-01-01和2012-01-02。在我的第二個示例中,不同的日期值是2012-01-01。 –

+0

@isme檢查我的編輯。我在那裏有一個解決方法。 – 2011-11-29 17:49:05