SQL:如何在接下来的三个可用日期中选择表条目?

时间:2011-09-29 12:38:51

标签: sql oracle where-clause

进一步澄清这个问题......

我有以下表ORDERS_TAB,其中包含一些示例信息:

|Order| Launch_Date |
|  1  |   27-Sep-11 |
|  2  |   29-Sep-11 |
|  3  |   30-Sep-11 |
|  4  |   03-Oct-11 |
|  5  |   28-Oct-11 |
|  8  |   10-Oct-11 |
|  7  |   29-Sep-11 |

我想选择所有订单,这些订单在接下来的三个可用日期内(包括当天)具有LAUNCH_DATE值。因此,如今今天是29日至9月11日,表中的三个可用日期将是9月29日至9月30日,9月30日至11日以及03年10月3日。因此查询将返回结果:

|Order| Launch_Date |
|  2  |   29-Sep-11 |
|  3  |   30-Sep-11 |
|  4  |   03-Oct-11 |
|  7  |   29-Sep-11 |

所以我假设我需要检查系统中的当前日期,搜索这个日期或下一个可用的日期然后找到接下来的两个可用日期..问题是我不知道如何这样做!

我正在寻找的是一个简单的SELECT语句,但有一些条件,但是非常感谢任何帮助,

感谢,你。 :)

6 个答案:

答案 0 :(得分:7)

SELECT
  *
FROM
(
  SELECT
    DENSE_RANK() OVER (ORDER BY Launch_Date) available_date_index,
    *
  FROM
    ORDERS_TAB
  WHERE
    Launch_Date >= TRUNC(Sysdate)
)
WHERE
  available_date_index <= 3


编辑由于对DENSE_RANK()如何工作存在困惑,这是OP的例子......

|Order| Launch_Date |    Available_Date_Index
|  1  |   27-Sep-11 | <excluded by WHERE clause>
|  2  |   29-Sep-11 |             1
|  3  |   30-Sep-11 |             2
|  4  |   03-Oct-11 |             3
|  5  |   28-Oct-11 |             5
|  8  |   10-Oct-11 |             4
|  7  |   29-Sep-11 |             1

这意味着退回的订单将为2,3,4,7。完全如OP所述。

答案 1 :(得分:3)

select * from ORDERS_TAB where Launch_Date in
   (select Launch_Date from
          (select distinct Launch_Date from ORDERS_TAB
                  where Launch_Date >= '2011-09-29' order by Launch_Date)
    WHERE rownum <= 3)

答案 2 :(得分:0)

select * from order_tab where launch_date in
(    
  select launchdate
    from
    (
      select launchdate from order_tab
      where launch_date >= SysDate -- Check this
      order by launch_date
    )  where rownum <= 3
)

看起来如何?

答案 3 :(得分:0)

编辑:正如评论所指出的,以下内容不起作用 也许去找

SELECT * FROM ORDERS_TAB WHERE LaunchDate IN (
  SELECT TOP(3) LaunchDate FROM ORDERS_TAB ((possibly WHERE LaunchDate > GETDATE()?))
  ORDER BY LaunchDate DESC )

答案 4 :(得分:-1)

试试这个:

SELECT * FROM ORDERS_TAB WHERE sysdate - launch_date <= 3

答案 5 :(得分:-1)

SELECT * FROM ORDERS_TAB其中Launch_Date介于'29 -sep-11'和ADDDATE之间('2007-09-01',3); 试试这个,希望这对你有帮助。