生成日期列之间的日期
Generate dates between to date columns
我正在尝试编写一个函数来填充临时文件 table。这个临时 table 将由我在名为 'Orders' 的 table 中的行填充(临时 table 和订单共享相同的列名)。 Orders 中的行是 Item、Location、Qty、SendDate 和 EndDate(SendDate 和 EndDate 的格式为 'yyyymmdd')。需要计算 SendDate 和 Enddate 之间的差值,并根据日期差分摊数量。示例:一行的数量为 200,SendDate 为 3/16,EndDate 为 3/20,该函数需要使用 3/16-3/20 的行填充 temp table数量 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
我是游标语句的新手,所以我不确定如何尝试。提前谢谢你。
在普通 table 表达式中使用 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
您可以使用 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;
我正在尝试编写一个函数来填充临时文件 table。这个临时 table 将由我在名为 'Orders' 的 table 中的行填充(临时 table 和订单共享相同的列名)。 Orders 中的行是 Item、Location、Qty、SendDate 和 EndDate(SendDate 和 EndDate 的格式为 'yyyymmdd')。需要计算 SendDate 和 Enddate 之间的差值,并根据日期差分摊数量。示例:一行的数量为 200,SendDate 为 3/16,EndDate 为 3/20,该函数需要使用 3/16-3/20 的行填充 temp table数量 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
我是游标语句的新手,所以我不确定如何尝试。提前谢谢你。
在普通 table 表达式中使用 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
您可以使用 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;