Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 月/n\u值之间_Oracle_Date_Logic - Fatal编程技术网

Oracle 月/n\u值之间

Oracle 月/n\u值之间,oracle,date,logic,Oracle,Date,Logic,我希望在查询中加入一些独特的逻辑,而不是调用函数 在本应用程序中,我查看给定股票代码的最近4个季度报告。表中的日期表示为YYYYMM,如本例所示: 201804, 201801, 201710, 201704 现在,有可能有一个季度不见了。也许公司没有提交季度报告,或者别的什么 所以,我想做的是看看是否有差距,或缺少四分之一: 201804, 201710, 201704, 201701 这里缺少201801……。我想我必须能够比较当前记录日期与LEAD 1或NTH值1日期值之间的月数,并看

我希望在查询中加入一些独特的逻辑,而不是调用函数

在本应用程序中,我查看给定股票代码的最近4个季度报告。表中的日期表示为YYYYMM,如本例所示:

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  |