【问题标题】:Select all where a range of date is in a range of date选择日期范围在日期范围内的所有内容
【发布时间】:2018-03-22 09:20:42
【问题描述】:
_______________________________________
|item    |created       |expiry       |
_______________________________________
|A       |01/01/2000    |01/02/2000   |
|B       |01/04/2000    |01/06/2000   |
|C       |01/05/2000    |01/11/2000   |
|D       |01/02/2000    |01/05/2000   |
|E       |01/06/2000    |01/07/2000   |

我想要的是选择所有输入的 start_range 和 end_range 之间的创建日期和到期日期之间的值。

例如。

start_range: 01/03/2000
end_range:   01/05/2000

上面的范围将具有值

01/03/2000
01/04/2000 
01/05/2000

输出如下:

_______________________________________
|item    |created       |expiry       |
_______________________________________
|B       |01/04/2000    |01/06/2000   |
|C       |01/05/2000    |01/11/2000   |
|D       |01/02/2000    |01/05/2000   |

不包括 A 和 E,因为它们之间的日期不在开始和结束范围之间的日期中。

【问题讨论】:

  • 你不能做类似WHERE DateToCheck BETWEEN Date1 AND Date2的事情吗?

标签: sql oracle oracle11g


【解决方案1】:
SELECT item,TO_CHAR(created,'DD/MM/YYYY') created,TO_CHAR(expiry,'DD/MM/YYYY') expiry
FROM Table1
WHERE created <= DATE '2000-01-05' AND expiry >= DATE '2000-01-03';

输出

ITEM    CREATED EXPIRY
B   04/01/2000  06/01/2000
C   05/01/2000  11/01/2000
D   02/01/2000  05/01/2000

现场演示

http://sqlfiddle.com/#!4/bee9f/16

【讨论】:

  • created &gt;= DATE '01/03/2000' AND created &lt;= DATE '01/05/2000' 也包括D
  • 感谢@Veljko89 的建议
  • 必须使用ANSI格式,即'2000-03-01'DATE '01/03/2000'不行。
  • 在结果集中缺少 item='D' 的行:sqlfiddle.com/#!4/936c2/2
  • 先生,您以不同的日期格式插入了值。为您的 sqlfiddleLink 使用以下查询:SELECT item,TO_CHAR(created,'DD/MM/YYYY') created,TO_CHAR(expiry,'DD/MM/YYYY') expiry FROM goods WHERE created &lt;= DATE '2000-05-01' AND expiry &gt;= DATE '2000-03-01'
【解决方案2】:

人类语言直接翻译成你想要的sql:

选择所有输入的 start_range 和 end_range 之间的创建日期和到期日期之间的值

select item, created, expiry
from table
where created between start_range and end_range
   and expiry between start_range and end_range;

【讨论】:

    【解决方案3】:

    这里是您的问题的解决方案:

    SELECT Item, created, expiry
    FROM Table1
    WHERE 
    created BETWEEN DATE '2000-01-03' AND DATE '2000-01-05'
    OR
    expiry BETWEEN DATE '2000-01-03' AND DATE '2000-01-05';
    

    点击演示链接:

    http://sqlfiddle.com/#!4/bee9f/2

    另一种方式:

    SELECT Item, created, expiry
    FROM Table1
    WHERE created <= DATE '2000-01-05' AND expiry >= DATE '2000-01-03';
    

    一般查询:

    SELECT Item, created, expiry
        FROM Table1
        WHERE created <= DATE end_range AND expiry >= DATE start_range;
    

    点击演示链接:

    http://sqlfiddle.com/#!4/bee9f/7

    【讨论】:

    • @Surface Tension Bro 试试上面的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多