从数据库中获取时间段
Posted
技术标签:
【中文标题】从数据库中获取时间段【英文标题】:Get timeslots from database 【发布时间】:2011-06-24 07:22:38 【问题描述】:我正在尝试从表中获取适合时隙的某些日期
时间段开始在当前日期时间floored到整点 时间段结束在当前 DateTimefloored 到整小时 加上 2 小时所以2011-06-24 09:21:40.020
的日期时间可能介于:
2011-06-24 09:00:00.000 AND 2011-06-24 11:00:00.000
目前我有这个,但我认为嵌套的DATEADD
是多余的。有没有更清洁的方法来做到这一点?
SELECT dbo.Computer.ComputerName, dbo.Planned.DatePlanned
FROM dbo.Computer INNER JOIN
dbo.Planned ON dbo.Computer.ComputerID = dbo.Planned.ComputerID
WHERE dbo.Planned.DatePlanned
BETWEEN
(SELECT DATEADD(Hour, DATEDIFF(Hour, 0, GETDATE()), 0))
AND
(SELECT DATEADD(Hour, DATEDIFF(Hour, 0, DATEADD(Hour, 2, GETDATE())), 0))
这应该给我当前活动时间段中的所有计算机名称和计划日期。
【问题讨论】:
【参考方案1】:我认为定义这两个变量更简洁:
DECLARE @Start DATETIME = DATEADD(Hour, DATEDIFF(Hour, 0, GETDATE()), 0)
DECLARE @End DATETIME = DATEADD(Hour, 2, @Start)
SELECT dbo.Computer.ComputerName, dbo.Planned.DatePlanned
FROM dbo.Computer
INNER JOIN dbo.Planned ON
dbo.Computer.ComputerID = dbo.Planned.ComputerID
WHERE dbo.Planned.DatePlanned
BETWEEN @Start AND @End
【讨论】:
【参考方案2】:我想不出一种数学上更简洁的方法;但就代码气味而言,您可以编写 UDF(自 SQL 2000 起受支持)。您可以从 UDF 获得一盎司的额外性能并在计算列中使用它(前提是它在两种情况下都绑定了架构)。
CREATE FUNCTION [dbo].[DateTimeHourFloor]
(
@DateTime DATETIME
)
RETURNS DATETIME
WITH SCHEMABINDING -- A little more perf.
AS BEGIN
RETURN DATEADD(Hour, DATEDIFF(Hour, 0, @DateTime), 0);
END;
你可以这样使用它:
SELECT dbo.Computer.ComputerName, dbo.Planned.DatePlanned
FROM dbo.Computer INNER JOIN
dbo.Planned ON dbo.Computer.ComputerID = dbo.Planned.ComputerID
WHERE dbo.Planned.DatePlanned
BETWEEN [dbo].[DateTimeHourFloor](GETDATE())
AND [dbo].[DateTimeHourFloor](DATEADD(Hour, 2, GETDATE()));
【讨论】:
以上是关于从数据库中获取时间段的主要内容,如果未能解决你的问题,请参考以下文章