2011-12-28 117 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)