2012-01-28 70 views
0

我在SQL SERVER中獲取日期的計數有點麻煩。我需要包含兩個日期開始日期和結束日期之間的日曆天數。用下面的例子的問題是,它總是返回10時,我認爲它應該是11DATEADD與部分日期

DECLARE @FROM DATETIME, @TO DATETIME 
SET @FROM = '18/12/2011 00:00:00' 
SET @TO = '28/12/2011 00:00:00' 

SELECT 
    DATEDIFF(MINUTE,@FROM,@TO), -- Returns 14459 
    DATEDIFF(HOUR,@FROM,@TO), -- Returns 241 
    DATEDIFF(DAY,@FROM,@TO), -- Returns 10 
    CEILING(CAST((DATEDIFF(HOUR,@FROM,@TO)/24) as DECIMAL(9,5))) --Returns 10 
    CEILING(CAST(CEILING(CEILING(CAST(DATEDIFF(SECOND,@FROM,@TO) as DECIMAL(18,5)))/60)/60 as DECIMAL(9,5))/24) --Returns 10 

如果有時間之間至少保持1秒鐘,但我必須考慮所有方案的底線工作。

我唯一的想法是簡單地將日期差異添加到部分日期帳戶中?這可靠嗎?

DATEDIFF(DAY,@FROM,@TO) + 1 

我碰上了回答這個問題How to find the total between the dates for each values

+0

感謝大家的回答; upvote for everyone :) – 2012-01-29 00:40:56

回答

2

新的東西是可以解決的時間,日期,SMALLDATETIME, DATETIME,DATETIME2,DATETIMEOFFSET或值的表達式。日期可以是 表達式,列表達式,用戶定義的變量或字符串 的文字。 startdate從結束日期中減去。

這是取自MSDN here

28-18 = 10.我想你會因爲DATEDIFF的定義而不得不在你的場景中加1。

1

時,您需要將@TO日期設置爲:

SET @TO = '28/12/2011 23:59:59' 
+0

謝謝,但日期是一個例子 - 它們不會被正常修復,並且示例值可能會發生。理想情況下,解決方案將在00:00:00時間內設置:) – 2012-01-28 12:53:43

+0

我們所做的是忽略時間,並始終將開始日期的時間設置爲0:00:00,並將結束日期設置爲23:59:59在兩個日期之間需要選擇的計算或查詢類型。 – ozczecho 2012-01-28 12:58:13

1

要得到兩個日期之間的天數(忽略的時間一天),包括開始和結束日期,嘗試;

SELECT FLOOR(CONVERT(FLOAT, @TO))-FLOOR(CONVERT(FLOAT, @FROM))+1 

編輯:

SELECT DATEDIFF(d, @FROM, @TO)+1 

好像又回到同樣的結果,這的確會使它做的更優雅的方式。總是認爲DATEDIFF時間部分在計算後會被截斷(如果開始時間晚於結束時間,將會給出錯誤結果),並且不會在爲您的情況提供正確結果的計算之前截斷。你好好學習天天向上:)

1

如果你想在C#DateTime.TotalDays()函數的近視當量(即知道分數天),您可以使用以下命令:

DECLARE @start DATETIME = '10 Apr 2012 15:00' 
DECLARE @end DATETIME = '12 Apr 2012 16:00' 

SELECT CONVERT(FLOAT, DATEDIFF(SECOND, @start, @end))/86400 

*注:在一天86400 =秒=24小時×60分鐘x 60秒