2015-10-14 71 views
0

我寫了一個存儲過程,它接受一個引用日期,併爲此元素添加一個小時。數據操作

這裏是我行所做的操作:

DATEADD(day, DATEDIFF(DAY, 0, @conductor_date), [HOUR]) 

例如,蒙山@conductor_date = '2015-10-15'[HOUR] = 23:00它的工作原理,並生成我這樣一個日期:'2015-10-15:23:00:00'

我面對一個邏輯問題,當值[實際上,要解決我的問題,我需要生成'2015-10-16:00:40:00'[HOUR] = 24:40

Actualy與這個值,我面臨的邏輯下面的例外on:

將varchar數據類型轉換爲日期時間數據類型導致 超出範圍值。

綜上所述,我需要的時間是比'23更多的照顧:59' ,並切換到第二天:

DECLARE @conductor_date datetime 
DECLARE @hour varchar(5) 
SET @conductor_date = '2015-10-15' 
SET @hour = '24:40' 

SELECT DATEADD(day, DATEDIFF(DAY, 0, @conductor_date), @hour) 

預計:2015-10-16:00:40:00

+0

選擇DATEADD(HOUR,23,GETDATE())爲於TIME_ADDED, GETDATE()作爲curr_date – mohan111

+0

您可以編輯你的信息我的例子嗎? –

+0

是固定在'varchar(5)'的小時類型嗎? – flo

回答

0

您可以將@hour場分成小時和分鐘,並分別添加它們:

DECLARE @conductor_date datetime 
DECLARE @hour varchar(5) 

DECLARE @hours int 
DECLARE @minutes int 
DECLARE @offset datetime 

SET @conductor_date = '2015-10-15' 
SET @hour = '24:40' 

SET @hours = cast(left(@hour, 2) as int) 
SET @minutes = cast(right(@hour, 2) as int) 
SET @offset = dateadd(day, datediff(day, 0,@conductor_date), 0) -- the begin of the day 

SELECT DATEADD(hour, @hours, dateadd(minute, @minutes, @offset)) 

當然,所有可以在一個行完成,但對於可視化我已經把它變成獨立的報表的緣故。

+0

完美的,我在一行中做到了,它完美的工作! –

+0

不需要通過在聲明中給conductor_date添加抵消。額外的代碼行@flo – mohan111

+0

@Jonathan這取決於OP想要達到什麼。在原來的方法'DATEADD(day,DATEDIFF(DAY,0,@conductor_date),@hour)'會忽略'@ conductor_date'的時間字段。我的例子總是這樣工作。如果'@ conductor_date'具有時間字段,並且我不截斷到一天的開始,則時間字段也將被添加。 – flo

1

按照documentation,日期/時間類型不支持大於23:59:59.9999999的時間。你必須爲此做手動字符串解析。

首先你需要提取總小時數,除以24得到總天數。然後計算剩餘的小時數,然後重建您的時間偏移量。

有了這些在手,你可以建立你所需要的輸出值:

DECLARE @v VARCHAR(20) = '24:40' 
DECLARE @start VARCHAR(20) = '2015-10-15' 

DECLARE @days INT 
DECLARE @leftover INT 

SET @leftover = CAST(LEFT(@v, 2) AS INT) 
SET @days = @leftover/24 
SET @leftover = @leftover - @days * 24 

SET @v = CAST(@leftover AS VARCHAR(2)) + SUBSTRING(@v, 3, 20) 

SELECT DATEADD(DAY, @days + DATEDIFF(DAY, 0, @start), @v) 

這裏的工作SQLFiddle

這支持以HH(前導零)開始並具有任何有效準確度(HH:mm:ss.fffffff)的時間字符串。

+0

P.S. SQLFiddle(通常)現在不適用於我,所以我無法驗證此答案 - 可能存在拼寫錯誤或錯誤。我會稍後嘗試添加鏈接。 – Amit

+0

有一個小錯誤,我得到'2015/10/16 00:00',但我期望:'2015/10/16 00:40' –

+0

@XavierWOLFF - 更正並添加sqlfiddle。 – Amit

0

你可以試試下面的查詢

SELECT DATEADD(MINUTE,(LEFT(@hour,2)*60+RIGHT(@hour,2)),@conductor_date)