生成日期列之间的日期

时间:2015-03-17 14:55:20

标签: sql oracle11g

我正在尝试编写一个将填充临时表的函数。此临时表将由我在名为' Orders'的表中的行填充。 (临时表和Orders共享相同的列名)。 Orders中的行包括Item,Location,Qty,SendDate和EndDate(SendDate和EndDate采用' yyyymmdd'格式)。需要采用SendDate和Enddate之间的差异,并通过日期的差异来扩展数量。示例:一个数量为200且SendDate为3/16且EndDate为3/20的行,该函数需要使用3 / 16-3 / 20的行填充临时表,数量为40。

Sample Data:
- Item    Location  Qty   SendDate    EndDate
 -Toy     Store     200    20150316    20150320

Desired result: 
 - Item    Location  Qty   SendDate    EndDate
  -Toy     Store     40    20150316    20150320
  -Toy     Store     40    20150317    20150320
  -Toy     Store     40    20150318    20150320
  -Toy     Store     40    20150319    20150320
  -Toy     Store     40    20150320    20150320

我是游标语句的新手所以我不确定如何尝试这个。提前谢谢。

2 个答案:

答案 0 :(得分:1)

在公用表表达式中使用UNION ALL可以为您提供所需的内容。

我不熟悉Oracle的日期操作,但是这样的事情可以起作用:

WITH x ( d ) AS (
    SELECT TO_DATE('2014-12-25', 'yyyy-mm-dd')
    FROM   dual
    UNION ALL
    SELECT d + interval '1' day
    FROM   x
    WHERE  d < TO_DATE('2014-12-31', 'yyyy-mm-dd')
)
SELECT *
FROM   x

答案 1 :(得分:1)

您可以使用CONNECT BY子句:

WITH YOUR_TABLE (Item,Location,Qty,SendDate,EndDate)
     AS (SELECT 'Toy','Store',200,20150316,20150320 FROM DUAL) -- sample data
    SELECT item,
           location,
           qty,
           TO_NUMBER (
              TO_CHAR (TO_DATE (senddate, 'yyyymmdd') + LEVEL - 1, 'yyyymmdd'))
              senddate,
           enddate
      FROM YOUR_TABLE
CONNECT BY LEVEL<=(TO_DATE(enddate,'yyyymmdd') - TO_DATE(senddate,'yyyymmdd')) + 1;