我正在尝试查询具有架构的表:
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'
谢谢,
马特
答案 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';