我需要一个查询,该查询将输出两个给定日期之间的日期列表。
例如,如果我的开始日期是2016年2月23日,结束日期是2016年2月3日,我期望获得以下输出:
Date ---- 23/02/2016 24/02/2016 25/02/2016 26/02/2016 27/02/2016 28/02/2016 29/02/2016 01/03/2016 02/03/2016
另外,我只需要使用SQL进行上述操作(不使用“ WITH”语句或表)。请帮忙。
我使用的通常是DB2 for iSeries,所以我将为您提供一个仅适用于它的SQL解决方案。目前,我无法访问服务器,因此该查询未经测试,但可以正常工作。 EDIT 查询已经过测试并且可以正常工作
SELECT d.min + num.n DAYS FROM -- create inline table with min max date (VALUES(DATE('2015-02-28'), DATE('2016-03-01'))) AS d(min, max) INNER JOIN -- create inline table with numbers from 0 to 999 ( SELECT n1.n + n10.n + n100.n AS n FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS n1(n) CROSS JOIN (VALUES(0),(10),(20),(30),(40),(50),(60),(70),(80),(90)) AS n10(n) CROSS JOIN (VALUES(0),(100),(200),(300),(400),(500),(600),(700),(800),(900)) AS n100(n) ) AS num ON d.min + num.n DAYS<= d.max ORDER BY num.n;
如果您不想只执行一次查询,则应考虑创建一个包含循环值的真实表:
CREATE TABLE dummy_loop AS ( SELECT n1.n + n10.n + n100.n AS n FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS n1(n) CROSS JOIN (VALUES(0),(10),(20),(30),(40),(50),(60),(70),(80),(90)) AS n10(n) CROSS JOIN (VALUES(0),(100),(200),(300),(400),(500),(600),(700),(800),(900)) AS n100(n) ) WITH DATA; ALTER TABLE dummy_loop ADD PRIMARY KEY (dummy_loop.n);
这取决于您喜欢使用它的原因,但您甚至可以为表创建表(例如100年)。只有100 * 365 = 36500行,只有一个日期字段,因此该表非常小,可以快速进行联接。
CREATE TABLE dummy_dates AS ( SELECT DATE('1970-01-01') + (n1.n + n10.n + n100.n) DAYS AS date FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS n1(n) CROSS JOIN (VALUES(0),(10),(20),(30),(40),(50),(60),(70),(80),(90)) AS n10(n) CROSS JOIN (VALUES(0),(100),(200),(300),(400),(500),(600),(700),(800),(900)) AS n100(n) ) WITH DATA; ALTER TABLE dummy_dates ADD PRIMARY KEY (dummy_dates.date);
选择查询可能类似于:
SELECT * FROM dummy_days WHERE date BETWEEN(:startDate, :endDate);
编辑2 :感谢@Lennart的建议,我将TABLE(VALUES(..,....))更改为VALES(......),因为他说TABLE是LATERAL的同义词,这是给我真正的惊喜。
编辑3 :感谢@ godric7gt,我删除了TIMESTAMPDIFF并将其从我所有的脚本中删除,因为正如文档中所述:
将第二个自变量中的信息(时间戳持续时间)转换为第一个自变量中指定的间隔类型时,将使用这些假设。在 返回的估计可以按天数的变化 。例如,如果为“ 1997-03-01-00.00.00”和“ 1997-02-01-00.00.00”之间的差值请求的天数(间隔16),则结果为30。这是因为时间戳记之间的差值为1个月,并且假设一个月中有30天。
这真是一个惊喜,因为我一直信任此功能,以免出现日差。