从数据库中获取时间段

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()));

【讨论】:

以上是关于从数据库中获取时间段的主要内容,如果未能解决你的问题,请参考以下文章

根据日期从数据库中获取结果而不考虑时间

从日期字段中删除时间值并在从数据库中获取数据时更改格式

从日期时间字段Mysql查询中获取日期

从查询中获取较旧的时间戳

从电脑获取当前时间并将其保存在数据库中

如何从日历数据库中获取可用时间段列表