【问题标题】:Sql query to find the dates between twoSql查询查找两个日期之间的日期
【发布时间】:2018-07-25 19:34:14
【问题描述】:

我有一个问题,我想获取记录在两个日期之间的日期(即开始和结束日期)。

我有一张表,里面有以下记录:

创建表t(a int, b date, c date);

insert into t values(1, to_date( '01-jan-2015'), to_date( '15-jan-2015'));
insert into t values(2, to_date( '03-jan-2015'), to_date( '10-jan-2015'));
insert into t values(3, to_date( '12-jan-2015'), to_date( '25-jan-2015'));
insert into t values(4, to_date( '20-jan-2015'), to_date( '01-feb-2015'));
insert into t values(5, to_date( '05-feb-2015'), to_date( '10-feb-2015'));

有没有办法使用 SELECT 语句来确定该表中给定日期范围内存在的日期?

EX: '01-jan-2015' to_date '15-jan-2015' 之间的值已经存在。 无论如何,在“03-jan-2015”和“12-jan-2015”上再次记录了两个值。 (而那些已经在('01-jan-2015' to_date '15-jan-2015')之间定义) 因此,我需要将输出作为"values for start_date "'03-jan-2015' is already logged" 而不在查询中提供日期范围。也就是说,它应该自动提取给定值的记录。

这假设当日期范围重叠时,它将消除日期范围之间的值过载

希望这是有道理的。请帮助我解决这个问题。

谢谢, 斯鲁提

【问题讨论】:

标签: sql plsqldeveloper


【解决方案1】:

试试下面的查询,它会列出所有重叠的条目。

SELECT  *
FROM    t as t1
WHERE EXISTS (
        SELECT  1
        FROM    t as t2
        WHERE   t1.a != t2.a
            AND t1.b <= t2.c AND t1.c >= t2.b
    )

或者用左连接试试这个

SELECT  t1.*,t2.a as overlap_id
FROM    t as t1
LEFT JOIN t as t2   ON t1.a > t2.a
            AND t1.b <= t2.c AND t1.c >= t2.b
WHERE   t2.a IS NOT NULL

a   b           c           overlap_id
--------------------------------------
2   2015-01-03  2015-01-10  1         --2 overlapped with 1
3   2015-01-12  2015-01-25  1         --3 overlapped with 1
4   2015-01-20  2015-02-01  3         --4 overlapped with 3

【讨论】:

  • 谢谢阿卜杜勒。但是,我如何获得在(如果记录)重叠条目之间的记录。即我只需要导出“'03-jan-2015'”的条目(从上面给出的数据)而不给出日期范围
  • 在你给出的数据中,记录1与记录2重叠,反之亦然,记录3与4重叠,反之亦然。
  • 记录 3 也与 1 和 4 重叠。
【解决方案2】:

试试这个

select * FROM AnyTable WHERE 
              start_date  <= '03-jan-2015' and end_date  >= '03-jan-2015'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 2011-07-04
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多