我正在使用SQLSERVER 2016,我有一个表格(时间表),其中包含以下数据:

ID Descrizione OraInizio OraFine
1 Morning 06:00:00 13:00:00
2 Afternoon 13:00:01 19:00:00
3 Night 19:00:01 05:59:59

现在,我需要使用DateTime从该表中提取ID,因此我编写了以下查询:

DECLARE @DATA AS DATETIME = '11-09-2023 00:30:00'
SELECT * 
FROM TIMETABLE
WHERE Convert(time(2), Convert(smalldatetime, @DATA)) BETWEEN ORAINIZIO AND ORAFINE

现在这个查询不起作用了:它应该提取ID=3,因为时间00:30在夜间范围内.

我如何更改我的查询以解决此问题?

推荐答案

你需要考虑ORAINIZIO >= ORAFINE的情况,因此时间被颠倒了.

你也不应该用BETWEEN来做比较,as noted here.相反,请使用>= AND <.

DECLARE @DATA AS DATETIME = '2023-09-11 00:30:00';
DECLARE @tim time(2) = CONVERT(time(2), @DATA);

SELECT * 
FROM TIMETABLE
WHERE (ORAINIZIO < ORAFINE  AND @tim >= ORAINIZIO AND @tim < ORAFINE)
   OR (ORAINIZIO >= ORAFINE AND (@tim < ORAFINE OR @tim >= ORAINIZIO);

Sql相关问答推荐

Snowflake SQL比较克隆x原始计数

用于动态查询情况的存储过程常识模式

我如何计算字母a出现的字符串的次数?

连接特定行号

在Postgres中实现合并功能的干净方法,因为当目标/源不匹配时

Lag()函数的差异:R与SQL(将R代码转换为SQL)

OVER子句WITH PARTITION BY和ORDER BY忽略主查询的WHERE子句

HAVING子句内部过滤的正确方法

我需要一个regexp_like来只验证字母D或T、数字和管道

使用同一个表,为什么IN、NOT IN、NOT EXISTS和EXISTS有不同的输出?

从每月生成的系列中生成每日汇率

Select 一个非零值减少重复

匹配 H[0-9][0-9] 但不匹配除字母 H 之外的任何字母

如何使用SELECT语句进行左连接,并根据右表中的特定值过滤结果?

按所选的值将记录分组到不同的列中

计数时如何为所有时间间隔返回 0 而不是什么都不返回

在多个表上递归查找

基于源表的 SQL INSERT、UPDATE 和 DELETE

PostgresQL-根据另一列找到 3 个最低值

如何比较同一张表中的行并进行相应更新