如何从一个月的第一天,两个月前到昨天获得一份日期表?

时间:2010-01-29 06:00:03

标签: sql date db2

我有一种情况,我通常会通过创建一个支线表(例如,五年前和未来一百年之间的每一个日期)来进行查询,但不幸的是,这个特殊的工作不允许创建这样一个表

所以我要向SO社区开放。今天是2010年1月29日。我可以运行什么查询,它会给出一个包含单个日期列的表,其值范围从2009年11月1日到2010年1月28日(含)?在2月1日,它应该给我每个日期从2009年12月1日到2010年1月31日。

我正在使用DB2,但我很高兴看到任何其他解决方案,他们可能提供一个线索。

我知道我可以从CURRENT DATE(或sysibm.sysdummy1 for Oracle bods)中选择dual,但我不确定如何在没有物理支持表的情况下立即选择日期范围。< / p>

3 个答案:

答案 0 :(得分:3)

这只是在两个日期之间的连续日期,但我已发布以显示您可以通过提供限制来消除递归错误。

with temp (level, seqdate) as 
(select 1, date('2008-01-01')
from sysibm.sysdummy1
union all
select level, seqdate + level days
from temp
where level < 1000 
and seqdate + 1 days < Date('2008-02-01')
)
select seqdate as CalendarDay
from temp
order by seqdate

从pax更新:

这个答案实际上让我走上正轨。您可以通过引入受常量限制的变量来消除警告。上面的查询没有相当正确(并且日期错误,我将原谅)但是,因为它指出了问题解决方案,它赢得了奖品。

以下代码是最终工作版本(无警告):

WITH DATERANGE(LEVEL,DT) AS (
  SELECT 1, CURRENT DATE + (1 - DAY(CURRENT DATE)) DAYS - 2 MONTHS
    FROM SYSIBM.SYSDUMMY1
  UNION ALL SELECT LEVEL + 1, DT + 1 DAY
    FROM DATERANGE
    WHERE LEVEL < 1000 AND DT < CURRENT DATE - 1 DAY
) SELECT DT FROM DATERANGE;

在2月2 nd 上运行时输出:

----------
    DT
----------
2009-12-01
2009-12-02
2009-12-03
:  :  :  :
2010-01-30
2010-01-31
2010-02-01

DSNE610I NUMBER OF ROWS DISPLAYED IS 63
DSNE616I STATEMENT EXECUTION WAS SUCCESSFUL.

答案 1 :(得分:0)

只是一个想法(甚至不确定你是怎么做的),但是让我们说你知道你想要多少天。喜欢45天。如果您可以选择列表1-45,您可以进行日期算术以从参考数据中减去该数字(即今天)。

这种有效(在MySQL中):

set @i = 0; 
SELECT @i:=@i+1 as myrow, ADDDATE(CURDATE(), -@i) 
FROM some_table 
LIMIT 10;

我的诀窍是如何使10变得动态。如果你可以这样做,那么你可以使用这样的查询来获得正确的数字限制。

SELECT DATEDIFF(DATE_SUB(CURDATE(), INTERVAL 1 DAY), 
                DATE_SUB(LAST_DAY(CURDATE()), INTERVAL 2 MONTH))
FROM dual;

答案 2 :(得分:0)

我以前没有使用过DB2,但是在SQL Server中你可以做类似以下的事情。请注意,您需要一个至少包含所需行数的行的表。

SELECT TOP 45 
    DATEADD(d, ROW_NUMBER() OVER(ORDER BY [Field]) * -1, GETDATE())
FROM 
    [Table]