2011-12-28 121 views
3

我在我的數據庫中的表中有3列 - Created,ExpiresExpiration_Interval。既CreatedExpiresdatetimeoffset(0)Expiration_Interval是數據類型Time(0)的。SQL Server 2008 R2中的DateTime計算

Created獲取與SYSUTCDATETIME(),插入新行時填充。爲Expiration_Interval數據在輸入XML提供在hh:mm:ss格式,提取並填充。要求是填充ExpiresCreated+Expiration_Interval。這是我的方法:

INSERT INTO SESSIONS 
    SELECT 
    Expiration_Interval, 
    SYSUTCDATETIME(), 
    DATEADD(s,((DATEPART(hh,Timeout)*3600)+(DATEPART(mi,Timeout)*60)+ DATEPART(ss,Timeout)),SYSUTCDATETIME()) 
    FROM input_xml -- CTE with shredded XML data 

有沒有更簡單的方法來做到這一點?這是SQL Server上2008 R2

+0

「更簡單的方法」 - 更容易以什麼方式? – 2011-12-28 09:09:19

+0

也許更容易是不正確的詞。更有效的方法? – Raj 2011-12-28 10:09:56

+0

比什麼效率更高?你的基準在哪裏? – 2011-12-28 10:32:11

回答

2

您可以將Timeout投射到datetime並使用+將時間添加到SYSUTCDATETIME()

SYSUTCDATETIME()+cast(Timeout as datetime) 
1

討厭這樣說:

declare @Time as Time = '01:00:00.00' 
declare @NoTime as Time = '00:00:00.00' 
declare @Now as DateTimeOffset = SysDateTimeOffset() 

select @Now as 'Now', @Time as 'One Hour', 
    DateDiff(s, @NoTime, @Time) as 'One Hour in Seconds', 
    DateAdd(s, DateDiff(s, @NoTime, @Time), @Now) as 'One Hour Hence' 

提示:我一般抓住「現在」中的一個變量,然後用它在整個查詢或存儲過程。它避免了多個函數調用並保持事物同步。當然,除非它是一段非常長的代碼,而且你真的想觀察進度。

1

我建議你把間隔存儲爲一個整數(秒)。您只需要執行以下操作:

DATEADD(s, Expiration_Interval, Created)