首页 > 解决方案 > SQL Server - 检查商店是否打开

问题描述

我有一张如下表

StoreName  | TimeOpens   |  DurationInMinutes | DayOfTheWeek
Dog Store  '00:08:00.000'          400              1
Duck Store  '00:08:00.000'        1300              1
Cat Store  '00:08:00.000'         1440              1

我需要选择所有当前营业的商店。时间以 UTC 格式存储,因此 GETUTCDATE() 可用于获取当前时间。TimeOpens 是一个Time对象而不是 DATETIME,这就是为什么我有点困惑如何编写一个可以让我得到正确答案的查询。场景是如果时间在午夜重叠,因为持续时间与 Duck Store 一样长,或者持续时间为 1440 分钟,这意味着它每天 24 小时开放。

我考虑过先将其转换为 DateTime,这会使事情变得更容易,但我不确定在计算时我会得到今天的日期还是昨天的日期。例如,如果我得到今天的日期和它过去的午夜,那么我就在商店开门之前,这意味着它已经关门了。我在选择一周中的某一天时遇到同样的问题,就好像它在技术上是第二天的午夜过去一样,但它仍然可以从前一天开始营业。

SELECT *
FROM Stores
WHERE GETUTCDATE() > CAST(LEFT(CONVERT(DATE, GETUTCDATE()), 10) + ' ' + LEFT(CONVERT(VARCHAR, S.[TimeOpens], 120), 12) AS DATETIME)

编辑,查询应该以某种方式包括 dayoftheweek 以及因为每一天可能有不同的时间表。它是一个 1-7 的指数。

标签: sqlsql-serverdatetimetime

解决方案


您可以使用此条件来获取它是否仍然是有效的开放时间。

SELECT *
FROM Stores
WHERE
datediff(mi, 
        dateadd(mi, DurationInMinutes,cast(concat(convert(DATE, getutcdate()), ' ', TimeOpens) as datetime))
    , getutcdate()) < 0

推荐阅读