根据一天中的时间查询值

时间:2011-07-28 08:54:16

标签: sql-server-2005 tsql datetime time

我正在尝试查询具有架构的表:

  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点之后使用明天的日期,早上8点之前使用今天的日期?

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

谢谢,

马特

1 个答案:

答案 0 :(得分:0)

这意味着一些假定的知识 - 启用时间是第一天,禁用时间总是第二天,并且您总是在第二天运行查询。

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';