日期大于当前日期范围内进行解码,以空值SQL查询

问题描述 投票:0回答:1

我创建了下面的查询给我一个日期范围内的结果集从01-Jan-2018 (c_date_from ) and 31-dec-2018 (c_date_to)

现在,我必须在这一个变化。说,例如为下面的数据,如果我通过c_date_from作为01-JAN-2018和作为c_date_to 31-DEC-2018。如果结束日期是31日 - 12月4712将它视为无效。它是为所有的情况下工作的罚款。但在代码的解码部分,我现在想以这样的方式,如果assignment_end_date列>比c_date_to应该把它当作空以及处理。例如 :

+-----------+---------------+---------------+-----------------------+---------------------+--------+
| person_id | next_employee | employee_name | assignment_start_date | assignment_end_date | Client |
+-----------+---------------+---------------+-----------------------+---------------------+--------+
|         1 | XYZ           | GEN           | 02-JAN-2018           | 03-jun-18           | DEL    |
|         1 | REC           | GEN           | 04-jun-18             | 01-nov-18           | DEL    |
|         1 | YZ            | GEN           | 02-nov-18             | 01-JAN-2019         | DEL    |
|         2 | FDGD          | PA            | 01-JAN-2018           | 02-APR-2018         | FAR    |
|         2 | FDRY          | PA            | 03-APR-2018           | 31-DEC-4712         | FAR    |
+-----------+---------------+---------------+-----------------------+---------------------+--------+

对于上面的表,我的查询获取数据以及当assignment_end_date是31日 - 12月4712则在解码其更改为NULL。现在我想,如果assignment_end_date(人ID 1日起最多01-JAN-2019)是> c_date_to(31日 - 12月2018在这种情况下),那么它也把它当作空。我如何处理它在下面的查询在同去?颂歌。

 SELECT papf.person_id,
        LEAD(papf.employee_number) OVER( ORDER BY papf.employee_number, paaf.effective_start_date,change_date ) next_employee,
        PAPF.full_name employee_name,    
        to_char(paaf.effective_start_date,'DD-MON-YY') assignment_start_date, 
        DECODE(paaf.effective_end_date, to_date('12/31/4712', 'MM/DD/YYYY'), NULL, paaf.effective_end_date)  assignment_end_date,
        ppd.segment3 Client,       
            from 
                xl.x_current_employees_gtt PAPF , -
                per_all_assignments_f PAAF,
                per_pay_proposals ppp,
                per_position_definitions ppd             
            WHERE 1 = 1
             --AND papf.employee_number in (60180)
                AND ppp.change_date(+) <= c_date_to  
             AND ppp.date_to(+)     >= c_date_from 
             AND ppp.change_date(+) <= paaf.effective_end_date
             AND ppp.date_to(+)     >= paaf.effective_start_date
             AND ppp.assignment_id(+) = paaf.assignment_id
             AND paaf.primary_flag = 'Y'
             AND paaf.assignment_status_type_id = g_assignment_status_type_id
             AND paaf.assignment_type = 'E'
             AND paaf.effective_start_date <= paaf.effective_end_date -- There are some cases, due to which this condition has been included
             AND paaf.effective_start_date <= c_date_to 
             AND paaf.effective_end_date   >= c_date_from 
             AND PAAF.person_id IN ( PAPF.person_id , NVL(papf.sez_person_id,PAPF.person_id) )
            ORDER BY employee_id,paaf.effective_start_date , change_date ; 
sql oracle
1个回答
2
投票

目前尚不清楚其中c_date_to是从哪里来的,但我相信它在这些表中的一个列。所以,我的DECODE转换为CASE

CASE WHEN paaf.effective_end_date = DATE '4712-12-31` OR 
     paaf.effective_end_date > c_date_too THEN NULL 
     ELSE paaf.effective_end_date END AS assignment_end_date

我发现使用文字短一点,比DATE更具可读性一TO_DATE

© www.soinside.com 2019 - 2024. All rights reserved.