当前位置: 首页 > 面试题库 >

IBM DB2:生成两个日期之间的日期列表

颛孙信厚
2023-03-14
问题内容

我需要一个查询,该查询将输出两个给定日期之间的日期列表。

例如,如果我的开始日期是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天。

这真是一个惊喜,因为我一直信任此功能,以免出现日差。



 类似资料:
  • 问题内容: 我需要生成两个给定日期之间的所有日期。只要只有一个日期范围,此方法就可以正常工作。但是,如果我有多个日期范围,则此解决方案不起作用。我在这里以及Asktom上都进行了搜索,但是找不到相关的指针/解决方案。 我使用all_objects和CONNECT BY ROWNUM尝试了两种解决方案,但是没有运气。这是问题说明:sqlfiddle 输入 输出 问题答案:

  • 问题内容: 使用标准的mysql函数可以编写查询,该查询将返回两个日期之间的天数列表。 例如,给定2009-01-01和2009-01-13,它将返回一个具有以下值的列表: 编辑:看来我还不清楚。我要生成此列表。我在数据库中存储了值(按日期时间),但希望将它们在左外部联接中汇总到上述日期列表中(我希望这种联接的某些右侧在几天内会为null并将对此进行处理) )。 问题答案: 我将使用此存储过程将所

  • 问题内容: 源表如下: 我想得到以下输出: 我必须使用循环来填充此表吗? 谢谢 问题答案: 您可以使用技巧来查询 演示

  • 问题内容: 我需要填充一个表,该表将存储2个给定日期之间的日期范围:09/01/11-10/10/11 因此,在这种情况下,该表将从2011年9月1日开始存储,直到每天存储到10/10/11,我想知道在SQL Server中是否有一种巧妙的方法-我目前正在使用SQL Server 2008 。 谢谢 问题答案: 在SQL 2005+上很容易;如果您有数字表或理货表,操作会更容易。我在下面伪造了它:

  • 问题内容: 我有两个这样的表: 表格1 表2 我想从 Table1中 选择并插入 Table2中 。 例如: 在表1中,我有这个 在表2中,我想要这个 带有样本数据的表结构 问题答案: 感谢您的架构。它使处理您的问题变得容易。我对您的架构进行了一些更改以利用auto_increment 在这里,我在emp_leave_daywise表上添加了唯一约束,因为id整数上的主键不能确保记录不重复。 em

  • 问题内容: 在我的应用程序中,用户应从选择日期。问题是生成此列​​表。例如,我需要 2010年至2013年 或 6月至8月 之间的所有日期(期间可能是 day , month , year )。是否有任何方法可以获取该数据? 范例:我需要 2013年1月1* 日 至2013年1月1 日之间的日期 * 2013年1月1日 2013年2月1日 2013年3月1日 2013年4月1日 2013年5月1日