【问题标题】:How to get last day data of previous 12 months from current month如何从当月获取前 12 个月的最后一天数据
【发布时间】:2019-12-19 23:39:05
【问题描述】:

oracle 中有一个名为 emp_table 的表,其中包含 emp_name(员工姓名)、emp_att(值仅为 P 或 A)和日期(以时间戳记)。我想查看当前月份前 12 个月的最后一天(月份结束日期)的 emp_att 值。请分享一个正确的查询来获得它。

【问题讨论】:

  • edit您的问题(通过单击下面的edit 链接)并添加一些sample data 和基于该数据的预期输出。 Formatted textno screen shots。 (edit 您的问题 - 在 cmets 中不要邮政编码或其他信息)
  • 解释这个问题就足够了。请理解,每个人都不能分享他/她的公司不允许的东西的截图。在对问题进行降级之前,您必须仔细考虑。
  • 我特别没有要求截图。而且我从未要求透露机密信息。但是一个好的问题应该包含一些样本数据(即使是编造的)和你想看到的结果。看看 Littlefoot 的回答——他实际上必须自己发明样本数据。 应该在您的问题中提供类似的内容。您可能想阅读this,了解如何提出有关 SQL 的好问题
  • 我很欣赏小脚的工作。您必须看到我在括号中提到了每列包含的数据,而 mallikarjuna 的回答非常好。小脚已经展示了一个很好的解释方法。简短而准确的问题比冗长的问题要好。不过感谢您的建议。

标签: sql date oracle11g


【解决方案1】:

这样的?

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> with emp_table (emp_name, emp_att, cdate) as
  2    (select 'Scott', 'P', date '2019-03-31' from dual union all
  3     select 'Scott', 'A', date '2019-04-30' from dual union all
  4     select 'Scott', 'A', date '2019-05-18' from dual union all  --> not the last day in May
  5     select 'Scott', 'P', date '2019-05-31' from dual union all
  6     select 'Scott', 'A', date '2019-06-13' from dual            --> not the last day in June
  7    )
  8  select emp_name, emp_att, cdate
  9  from emp_table
 10  where cdate >= add_months(sysdate, -12)
 11    and cdate = last_day(cdate);

EMP_N E CDATE
----- - ----------
Scott P 31.03.2019
Scott A 30.04.2019
Scott P 31.05.2019

SQL>

【讨论】:

  • 感谢您的建议。检查后将恢复。
【解决方案2】:

假设您的案例中的最后一个日期可能不是该月的最后一个日期,并且所有月份的所有员工的最后一个日期都相同:

SELECT  *  FROM 
(SELECT A.*,
LAST_VALUE(EMP_DATE) OVER(PARTITION BY TO_CHAR(EMP_DATE,'MON-YYYY') ORDER BY TO_CHAR(EMP_DATE,'MON-YYYY')) LAST_DT
FROM EMP_DATE A
WHERE 
EMP_DATE BETWEEN ADD_MONTHS(TO_CHAR(SYSDATE,'DD-MON-YYYY'), -12) AND TO_CHAR(SYSDATE,'DD-MON-YYYY'))
WHERE EMP_DATE=LAST_DT
  • last_value 函数将给出最后工作日期 特定月份

  • select 语句中的条件会将日期限制为从当前日期起持续一年,您可以将 sysdate 更改为您自己的日期

【讨论】:

  • FROM 之后应该是表名。测试您的建议。
  • 不必给出表名,因为它是内联视图,从内部查询中获取所有内容
  • 除一件事外,此查询一切正常。与前几个月的最后一天数据,它应该显示 sysdate 数据,但它显示的是 sysdate 前一天的数据,即如果今天是 8 月 15 日,它显示的是 8 月 14 日的数据。显示7月31日的数据后,如果显示今天的数据,那就更有成效了。不过感谢您的宝贵建议。
  • 嗨,Shekar,这完全取决于表中的数据,如果您获得今天的数据,即 16-AUG -2019 今天本身,您可以看到今天的日期,它将是特定月份的最后一个日期在表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 2014-03-22
相关资源
最近更新 更多