Получить временные интервалы из базы данных - PullRequest
2 голосов
/ 24 июня 2011

Я пытаюсь получить определенные даты, которые соответствуют временным интервалам из таблицы, где

  • временной интервал начинается в текущем DateTime с полными до полного часа
  • временной интервал заканчивается в текущем DateTime с полными до полного часа плюс 2 часа

поэтому DateTime, равный 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))

Это должно дать мне все имена компьютеров и плановые даты в текущем активном временном интервале.

Ответы [ 2 ]

1 голос
/ 24 июня 2011

Я не могу придумать математически более чистый способ сделать это;но с точки зрения запаха кода вы могли бы написать 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()));
1 голос
/ 24 июня 2011

Я думаю, что лучше определить эти две переменные:

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
...