从 DB2 查询中 where 子句中输入的日期获取上个月
Posted
技术标签:
【中文标题】从 DB2 查询中 where 子句中输入的日期获取上个月【英文标题】:Fetch previous month from the date entered in where clause in query in DB2 【发布时间】:2019-09-07 16:02:31 【问题描述】:我想知道是否有办法获取上个月的记录?例如,如果运行以下查询,则查询应为 2019 年 1 月 4 日至 2019 年 4 月 30 日(4 月 1 日至 4 月 30 日)之间的交易提供输出。
select * from table where transdate>='01-01-2019' and transdate <='31-05-2019'
Sample data
TRANSDATE LABOR Hours
01-01-2019 A 2.5
23-01-2019 B 1.0
01-02-2019 B 3.0
12-03-2019 A 0.5
02-04-2019 A 1.5
12-04-2019 B 4.5
17-04-2019 B 2.0
22-04-2019 C 2.5
12-05-2019 A 3.5
Expected Output
TRANSDATE LABOR Hours
Apr-2019 A 1.5
Apr-2019 B 6.5
Apr-2019 C 2.5
【问题讨论】:
您的问题是要求提供一个月的数据,但您的WHERE
子句要求提供整个 1 月到 5 月的数据。你真正想要哪一个?
是的,用户会输入 3 个月或 6 个月的日期,但有一个部分的数据应该只显示单月数据,因此我想知道这是否可能。
@max092012 请提供数据示例和所需结果。
@MarkBarinstein 用示例数据编辑了我的问题。
旁注:绝对不要对日期/时间类型使用包含上限 (<=
),尤其是在处理“月末”时。你会发现说“比下个月的开始时间少”远更容易——也就是说,一个专属的上限 (<
)——你会惊讶于有多少人忘记了跳跃天...
【参考方案1】:
如果last previous month
是根据用户输入(例如2019-05-31
)计算出来的,那么:
select to_char(TRANSDATE, 'Mon-YYYY', 'en-US') as TRANSDATE, LABOR, sum(Hours) as Hours
from table
where transdate between
date('2019-05-31') - (day(date('2019-05-31')) - 1) days - 1 month
and date('2019-05-31') - day(date('2019-05-31')) days
group by to_char(TRANSDATE, 'Mon-YYYY', 'en-US'), LABOR
;
用户可以提供任何月份的日期。 between
子句中的表达式的结果对于任何提供的同月日期都是相同的。
【讨论】:
请不要对日期/时间类型使用BETWEEN
(或更具体地说,包括上限)。最好使用独占上界。以上是关于从 DB2 查询中 where 子句中输入的日期获取上个月的主要内容,如果未能解决你的问题,请参考以下文章
在 where 子句中使用 next_day 和 to_date
在 Java DB2 JDBC 中:如何在 SELECT 语句的 WHERE 子句中使用空参数,其中值可以为空或不为空?