首页 > 解决方案 > 将年份分配给过去 6 个月的月份

问题描述

从下面的数据中,我如何在 DS_YEAR 列中分配年份,其中年份不是基于 DS_MONTH 分配的。

DS_MONTH|   DS_DAY| DS_YEAR
--------|---------|--------
Mar     |   2     | 2019
Jan     |   4     | 2020
Apr     |   2     | 07:43
Sep     |   1     | 06:00
Jul     |   2     | 05:00
Dec     |   4     | 2019
Feb     |   7     | 2020
Nov     |   9     | 2019

从以上数据来看;从现在到过去 6 个月之间的任何数据都有 TIME 而不是 YEAR。但是我想写一个查询来附加相应的年份而不是时间。

我有以下查询,它将附加当前年份,但是如果我们的数据将位于上一年的过渡月份,它将不准确。

SELECT
    DS_MONTH || '-' || DS_DAY || '-' ||
    CASE
        WHEN DS_YEAR LIKE '%:%' THEN TO_CHAR(sysdate, 'YYYY')
        ELSE DS_YEAR
    END dsf
FROM
    MY_TABLE

我如何检查月份是在今年还是上一年,以便我可以分配正确的年份?

示例:如果今天是 2 月。在我的数据中,Sep | 1 | 06:00我的查询应该返回Sep-1-2019 ,如果今天是 10 月,它应该返回Sep-1-2020

标签: sqloracle

解决方案


这是你想要的吗 ?

WITH sampledata (mon, d, yt) AS
(
SELECT 'Mar','2','2019' FROM DUAL UNION
SELECT 'Jan','4','2020' FROM DUAL UNION
SELECT 'Apr','2','07:43' FROM DUAL UNION
SELECT 'Sep','1','06:00' FROM DUAL UNION
SELECT 'Jul','2','05:00' FROM DUAL UNION
SELECT 'Dec','4','2019' FROM DUAL UNION
SELECT 'Feb','7','2020' FROM DUAL UNION
SELECT 'Nov','9','2019' FROM DUAL
),rundate (dt) AS
(
SELECT DATE'2021-05-30' FROM DUAL
)
SELECT s.mon, s.d, s.yt, 
       CASE WHEN TO_DATE(s.mon||'-'||s.d||'-'|| extract(year from r.dt),'Mon-dd-YYYY') > r.dt THEN TO_DATE(s.mon||'-'||s.d||'-'|| extract(year from ADD_MONTHS(r.dt,-12)),'Mon-dd-YYYY')
            ELSE TO_DATE(s.mon||'-'||s.d||'-'|| extract(year from r.dt),'Mon-dd-YYYY')
       END
  FROM sampledata s CROSS JOIN rundate r
 WHERE INSTR(s.yt,':') > 0
UNION
SELECT s.mon, s.d, s.yt, TO_DATE(s.mon||'-'||s.d||'-'|| s.yt,'Mon-dd-YYYY') 
  FROM sampledata s
 WHERE INSTR(s.yt,':') = 0;

更新:添加了“运行日期”CTE,因此您可以使用任何日期进行测试,而不仅仅是 sysdate。还添加了 case 表达式来检查确保日期是过去的。


推荐阅读