sql - 两个日期和两个时间列sql server之间的可用房间预订
问题描述
我的表中有四列。
STARTDATE STARTTIME ENDDATE ENDTIME ROOMCODE
2018-10-16 00:00:00.000 14:00 2018-10-16 00:00:00.000 18:00 CS0001
2018-10-16 00:00:00.000 18:00 2018-10-16 00:00:00.000 22:00 CS0001
我想检查预订是否可用
select CONFERENCE_ROOM from COR_CONFERENCE_BOOKING where
(cast(STARTDATE as datetime) + cast(START_TIME as time) >= cast('2018-10-16'
as datetime) + cast(DATEADD(MINUTE, 01, '14:00') as time)
and cast(STARTDATE as datetime) + cast(START_TIME as time) < cast('2018-10-
16' as datetime) + cast('18:00' as time))
or (cast(ENDDATE as datetime) + cast(END_TIME as time) >= cast('2018-10-16'
as datetime) + cast(DATEADD(MINUTE, 01, '14:00') as time)
and cast(ENDDATE as datetime) + cast(END_TIME as time) < cast('2018-10-16'
as datetime) + cast('18:00' as time))
and CONFERENCE_ROOM='CS0001'
问题是我想选择数据,如果在通过日期和时间的选择查询中找到任何数据然后房间被预订,否则它是免费的。
请解决这个问题。它对我来说太复杂了。
解决方案
这是 MS SQL Server 的示例代码段。
我假设这是您的目标 RDBMS,因为示例 SQL 使用该 DATEADD 函数。
它只会返回表变量中的第一条记录。
因为第二条记录超出了范围。
declare @Table table (
ID INT PRIMARY KEY IDENTITY(1,1),
STARTDATE date,
STARTTIME time,
ENDDATE date,
ENDTIME time,
CONFERENCE_ROOM varchar(6)
);
insert into @Table (STARTDATE, STARTTIME, ENDDATE, ENDTIME, CONFERENCE_ROOM) values
('2018-10-16','14:00:00','2018-10-16','18:00:00','CS0001'),
('2018-10-16','18:00:00','2018-10-16','22:00:00','CS0001');
select ID, CONFERENCE_ROOM
from @Table t
where (CAST(STARTDATE AS DATETIME) + CAST(STARTTIME as DATETIME)) < (CAST(ENDDATE AS DATETIME) + CAST(ENDTIME as DATETIME))
and (CAST(STARTDATE AS DATETIME) + CAST(STARTTIME as DATETIME)) >= CAST('2018-10-16 14:00' AS DATETIME)
and (CAST(ENDDATE AS DATETIME) + CAST(ENDTIME as DATETIME)) <= CAST('2018-10-16 18:00' AS DATETIME)
and CONFERENCE_ROOM = 'CS0001';
如果 STARTTIME 和 ENDTIME 是 VARCHAR 而不是 TIME 数据类型?
然后,为了避免尝试转换废话数据时出错,您可以改用 TRY_CAST。
(如果 TRY_CAST 在您的 MS SQL Server 版本上可用)因为当转换失败时,TRY_CAST 将返回 NULL 而不是错误。
例子:
select ID, CONFERENCE_ROOM
from @Table t
where STARTDATE = ENDDATE
and TRY_CAST(STARTTIME AS TIME) < TRY_CAST(ENDTIME AS TIME)
and STARTDATE = CAST('2018-10-16' AS DATE)
and TRY_CAST(STARTTIME AS TIME) >= CAST('14:00' AS TIME)
and TRY_CAST(ENDTIME AS TIME) <= CAST('18:00' AS TIME)
and CONFERENCE_ROOM = 'CS0001';
推荐阅读
- javascript - 如何在 iPadOS15 Safari 中禁用放大镜
- goland - 如何在使用 goland 时使用“go cache”运行测试
- javascript - Vue JS 2. 如何防止在两个父级之间导航时重新加载相同的嵌套组件?
- python - Python While循环只接受整数
- typescript - 如何将`VueI18n`与打字稿和`vue2.0`一起使用?`new VueI18n({..})` 报告`没有构造签名` 错误
- vue.js - 循环遍历一个对象
- javascript - 当我在 Material-ui 表中渲染一个按钮时,该按钮不可点击
- python - 创建某些 XML 元素的文本 python pandas 的数据框
- docker - Docker 约束,直到节点关闭
- swiftui - 你能从 SwiftUI 中的 MapKit 数据库中获取纬度和经度吗