我写了一个查询,选择那些OPENING TIME大于当前时间的记录,并且OPENING DATE和当前日期之间的日期差异应该是< = 3且> = 0,实际上是为了通知弹出窗口的目的告诉你哪些工作在3天内开放。一旦打开,就不应该选择任何记录,即日期差异为0,当前时间大于上述开放时间。
现在我的查询在某些情况下有效,例如选择< = 3和> = 0的记录,但如果当前时间超过任何一天的开放时间则不会。由于我使用了AND运算符,因此失败,即如果Opening Time为14:00,当前时间为14:01,那么< = 3和> = 0也会失败。
我的查询:
concurrent.futures
答案 0 :(得分:0)
不要尝试将日期和时间用作单独的字段,最好将它们放在一起,只使用 datetime 数据类型。我已从您的架构中删除了OpeningTime字段,并将OpeningDate用作日期时间。
create table Works (
NIT_No int,
WorkNO int,
WorkName varchar(32),
OpeningDate datetime
)
以下是我使用的一些示例数据:
+ ------ + ------- + -------- + ----------------------- +
| NIT_No | Work_No | WorkName | OpeningDate |
+ ------ + ------- + -------- + ----------------------- +
| 1 | 1 | Work1 | 2017-02-26 16:21:15.083 |
| 2 | 2 | Work2 | 2017-02-27 09:21:15.083 |
| 2 | 3 | Work3 | 2017-03-01 00:21:15.083 |
| 3 | 4 | Work4 | 2017-03-01 13:09:15.083 |
| 4 | 5 | Work5 | 2017-03-02 13:21:15.083 |
| 5 | 6 | Work6 | 2017-03-03 17:21:15.083 |
| 5 | 7 | Work7 | 2017-03-04 11:45:15.083 |
| 5 | 8 | Work8 | 2017-03-04 19:21:15.083 |
+ ------ + ------- + -------- + ----------------------- +
您希望在getdate之前保留任何开放日期的记录,并且到_____ 不到三天。在这里我们填补空白。您是否关心准确小时,分钟,秒?这取决于您,可能取决于您的应用程序。我打算用分钟。所以我希望在距离getdate 0到3 * 24 * 60分钟之间加入日期。以下查询就是这样做的
Select @NotificationAllowed as IsAllowed,
NIT_No,
WorkNo,
WorkName,
DATEDIFF(day, GETDATE(), OpeningDate) as TotalDaysRemaining,
OpeningDate as OpeningDate
from #Works
Where DATEDIFF(Minute, GETDATE(), OpeningDate) between 0 and 3*24*60
在2017年3月1日下午12:35运行时,我得到以下结果
+ ------ + ------- + -------- + --- + ----------------------- +
| NIT_No | Work_No | WorkName | TDR | OpeningDate |
+ ------ + ------- + -------- + --- + ----------------------- +
| 3 | 4 | Work4 | 0 | 2017-03-01 13:09:15.083 |
| 4 | 5 | Work5 | 1 | 2017-03-02 13:21:15.083 |
| 5 | 6 | Work6 | 2 | 2017-03-03 17:21:15.083 |
| 5 | 7 | Work7 | 3 | 2017-03-04 11:45:15.083 |
+ ------ + ------- + -------- + --- + ----------------------- +
您所要做的就是包括逻辑程序流和Organization_ID的额外过滤器。