首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Select在某个时间间隔之间

Select在某个时间间隔之间
EN

Stack Overflow用户
提问于 2018-05-11 12:05:39
回答 2查看 306关注 0票数 1

我有桌子T1:

代码语言:javascript
复制
ID  SCHEDULE
1   2018-05-12 14:00:00

我有T2桌

代码语言:javascript
复制
 SCHEDULESTART       SCHEDULEEND
 09:00                  17:00

我需要从T1表中进行选择。

我想从T1获取所有的行,其中调度字段中的时间位于时间段之间(从第二个表开始和结束)。

我在一些IBM应用程序中工作,其中只有可能的在第一个表T1的where子句之后从T1语句开始。

因此,查询(不幸)必须始终以"SELECT * FROM T1 WHERE..."开头,这是不能更改的(请记住这一点)。

这意味着我不能在"FROM T1"部件之后使用某些JOIN或UNION语句,因为我只能在WHERE子句之后才开始编写SQL。

在这个例子中,这样的语句是可以的:

代码语言:javascript
复制
select TIME(SCHEDULE) from T1
where  TIME(SCHEDULE)>=(SELECT SCHEDULESTART FROM T2 ) 
AND    TIME(SCHEDULE)<=(SELECT SCHEDULEEND FROM T2)

它将返回正确的结果。

但是,如果调度是2018-05-12 23:00:00SCHEDULESTART is 22:00:00SCHEDULEEND is 03:00:00,那么这个查询就不能工作(这是合乎逻辑的,因为时间是在夜间,从第一天切换到第二天)!可在T2表中计算的最大时间周期为24小时时间段(仅为1天)。

如何确切地定义SQL查询以涵盖所有情况?谢谢,

EN

回答 2

Stack Overflow用户

发布于 2018-05-11 12:09:33

这是一个复杂的例子。我会把你的版本写成:

代码语言:javascript
复制
where EXISTS (SELECT 1 FROM T2 WHERE TIME(T1.SCHEDULE) BETWEEN SCHEDULESTART AND SCHEDULEEND)

然后,您可以将其修改为:

代码语言:javascript
复制
where EXISTS (SELECT 1
              FROM T2
              WHERE (SCHEDULESTART <= SCHEDULEEND AND
                     TIME(T1.SCHEDULE) BETWEEN SCHEDULESTART SCHEDULEEND)
                    ) OR
                    (SCHEDULESTART > SCHEDULEEND AND
                     TIME(T1.SCHEDULE) NOT BETWEEN SCHEDULESTART AND SCHEDULEEND)
                    )
              );
票数 0
EN

Stack Overflow用户

发布于 2018-05-11 12:33:47

试试这个:

代码语言:javascript
复制
where 
EXISTS (
        SELECT 
            1
        FROM 
            T2
        WHERE 
            ( 
                SCHEDULESTART <= SCHEDULEEND 
            AND
                TIME(T1.SCHEDULE) BETWEEN SCHEDULESTART AND SCHEDULEEND
            )
        OR
            (
                SCHEDULESTART > SCHEDULEEND AND
                (
                    TIME(T1.SCHEDULE) NOT BETWEEN SCHEDULEEND AND SCHEDULESTART
                ) 
                OR 
                    TIME(T1.SCHEDULE) = SCHEDULESTART 
                OR 
                    TIME(T1.SCHEDULE) = SCHEDULEEND
            )
        );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50292011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档