Oracle 月/n\u值之间
我希望在查询中加入一些独特的逻辑,而不是调用函数 在本应用程序中,我查看给定股票代码的最近4个季度报告。表中的日期表示为YYYYMM,如本例所示:Oracle 月/n\u值之间,oracle,date,logic,Oracle,Date,Logic,我希望在查询中加入一些独特的逻辑,而不是调用函数 在本应用程序中,我查看给定股票代码的最近4个季度报告。表中的日期表示为YYYYMM,如本例所示: 201804, 201801, 201710, 201704 现在,有可能有一个季度不见了。也许公司没有提交季度报告,或者别的什么 所以,我想做的是看看是否有差距,或缺少四分之一: 201804, 201710, 201704, 201701 这里缺少201801……。我想我必须能够比较当前记录日期与LEAD 1或NTH值1日期值之间的月数,并看
201804,
201801,
201710,
201704
现在,有可能有一个季度不见了。也许公司没有提交季度报告,或者别的什么
所以,我想做的是看看是否有差距,或缺少四分之一:
201804,
201710,
201704,
201701
这里缺少201801……。我想我必须能够比较当前记录日期与LEAD 1或NTH值1日期值之间的月数,并看到过去4个记录(4个季度)的差异为3个月。如果没有,则缺少一些记录,我将返回一个空值,这是应用程序所需要的
有什么想法或独特的逻辑吗?或者我需要编写一个函数并调用它
谢谢 只需将所有内容转换为日期,并使用带有自联接的日期操作即可
With cte as (
SELECT "val",
TO_DATE("val", 'YYYYMM') as original
FROM Table1
)
SELECT c1."val", c1.original,
c2.original as next_quarter,
c3.original as previous_quarter
FROM cte c1
LEFT JOIN cte c2
ON c1.original = ADD_MONTHS(c2.original, -3)
LEFT JOIN cte c3
ON c1.original = ADD_MONTHS(c3.original, 3)
ORDER BY c1."val"
输出
| val | ORIGINAL | NEXT_QUARTER | PREVIOUS_QUARTER |
|--------|----------------------|----------------------|----------------------|
| 201701 | 2017-01-01T00:00:00Z | 2017-04-01T00:00:00Z | (null) |
| 201704 | 2017-04-01T00:00:00Z | (null) | 2017-01-01T00:00:00Z |
| 201710 | 2017-10-01T00:00:00Z | (null) | (null) |
| 201804 | 2018-04-01T00:00:00Z | (null) | (null) |
您可以创建季度日历,并将此数据与季度数据合并。这就是查询的外观。
p_start_year
是日历开始的年份,而p_no_of_qtrs
统计日历中出现的季度数
WITH
mydata
AS
(SELECT '201804' AS quarter FROM DUAL
UNION
SELECT '201801' AS quarter FROM DUAL
UNION
SELECT '201710' AS quarter FROM DUAL
UNION
SELECT '201704' AS quarter FROM DUAL),
calendar
AS
(SELECT TO_CHAR (
ADD_MONTHS (
TO_DATE (:p_start_year || '-01-01', 'YYYY-MM-DD'),
(LEVEL
- 1)
* 3
),
'YYYYMM'
)
AS quarter
FROM DUAL
CONNECT BY LEVEL <= :p_no_of_qtrs)
SELECT c.quarter, d.quarter AS status
FROM mydata d,
calendar c
WHERE c.quarter = d.quarter(+)
ORDER BY c.quarter;
丢失的四分之一显示为空
QUARTER | STATUS
201701 |
201704 | 201704
201707 |
201710 | 201710
201801 | 201801
201804 | 201804
201807 |
201810 |