从 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 用示例数据编辑了我的问题。 旁注:绝对不要对日期/时间类型使用包含上限 (&lt;=),尤其是在处理“月末”时。你会发现说“比下个月的开始时间少”更容易——也就是说,一个专属的上限 (&lt;)——你会惊讶于有多少人忘记了跳跃天... 【参考方案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 子句中使用子查询从表中选择第二大日期

db2中sql语句的where从句 不等于怎么写

在 where 子句中使用 next_day 和 to_date

在 Java DB2 JDBC 中:如何在 SELECT 语句的 WHERE 子句中使用空参数,其中值可以为空或不为空?

查询 eloquent where 子句中的所有值

如何在 Kafka Connect JDBC Source 连接器中添加显式 WHERE 子句