【问题标题】:Fetch previous month from the date entered in where clause in query in DB2从 DB2 查询中 where 子句中输入的日期获取上个月
【发布时间】: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;)——你会惊讶于有多少人忘记了跳跃天...

标签: db2


【解决方案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(或更具体地说,包括上限)。最好使用独占上界。
猜你喜欢
  • 2022-01-13
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
相关资源
最近更新 更多