【问题标题】:Query value based on time of the day根据一天中的时间查询值
【发布时间】:2011-10-14 22:37:54
【问题描述】:

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

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

表中的两个值存储了应启用或禁用节电的时间:

晚上 10:00 启用省电
上午 08:00 禁用PowerSave

我想要做的是查询表以查看当前时间是否在 EnablePowerSave 和 DisablePowerSave 窗口之间。

我目前正在使用以下查询它,它总是返回 false,这是因为它使用的是今天的日期。如果在上午 8 点之后使用明天的日期,而在上午 8 点之前使用今天的日期,那么更改查询的最佳方法是什么?

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

谢谢,

马特

【问题讨论】:

    标签: sql-server-2005 tsql datetime time


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      • 2012-01-28
      • 2014-06-07
      • 2011-06-21
      • 1970-01-01
      相关资源
      最近更新 更多