Значение запроса в зависимости от времени суток - PullRequest
0 голосов
/ 28 июля 2011

Я пытаюсь запросить мою таблицу со схемой:

  CREATE TABLE [dbo].[FIN_MeetingDisplay-DefaultConfig](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [name] [varchar](150) NOT NULL,
    [value] [nvarchar](max) NOT NULL
  )

Два значения в таблице хранят время, когда энергосбережение должно быть включено или отключено:

EnablePowerSave 10:00 PM
DisablePowerSave 08:00 AM

Я хочу сделать запрос к таблице, чтобы узнать, находится ли текущее время между окнами EnablePowerSave и DisablePowerSave.В настоящее время я запрашиваю его с помощью следующего, который всегда возвращает false, потому что он использует сегодняшнюю дату.Как лучше всего изменить запрос так, чтобы, если это было после 8:00, чтобы использовать завтрашнюю дату, и до 8:00, чтобы использовать сегодняшнюю дату?

SELECT  CONVERT(DATETIME, CAST(GETDATE() AS VARCHAR(11)) + ' ' + VALUE, 103)
FROM    dbo.[FIN_MeetingDisplay-DefaultConfig]
WHERE   name = 'EnablePowerSave'

Спасибо,

Matt

1 Ответ

0 голосов
/ 28 июля 2011

Это подразумевает некоторое предполагаемое знание - что время включения указано в первый день, а время отключения - всегда следующий день, и вы всегда выполняете запрос на следующий день.

DECLARE @t SMALLDATETIME;
SET @t = CURRENT_TIMESTAMP;

;WITH x(n,t) AS
(
  SELECT name = LEFT(name, 1), 
    DATEADD(DAY, CASE WHEN LEFT(name, 1) = 'E' THEN -1 ELSE 0 END, 
    CONVERT(SMALLDATETIME, CONVERT(CHAR(8), CURRENT_TIMESTAMP, 112) 
    + ' ' + value))
  FROM dbo.[FIN_MeetingDisplay-DefaultConfig]
  WHERE name IN ('EnablePowerSave', 'DisablePowerSave')
)
SELECT 
  [start]   = x.t,
  [end]     = y.t,
  [current] = @t,
  [status]  = CASE 
    WHEN @t BETWEEN x.t AND y.t 
        THEN 'between' 
        ELSE 'not between' 
    END
FROM x 
CROSS JOIN x AS y
WHERE x.n = 'E'
AND y.n = 'D';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...