[英]month and year string value compared to date in oracle sql
表中有2列
id CLOSED_DATE
1 11/01/2017
2 12/01/2017
3 12/02/2017
4 01/01/2018
5 02/01/2018
我的月份和年份的字符串值的格式為“ DEC-2017”,如何查找前幾個月(Id:1)和下個月(id:4,5)的所有值
我嘗試如下所示,但它給了我ID 3,4和5,因為TO_DATE('DEC-2017','MON-yyyy')轉換為01-DEC-2017。
select id from table where TO_DATE('DEC-2017','MON-yyyy') > CLOSED_DATE;
只需添加一個add_months()
:
select id
from table
where add_months(TO_DATE('DEC-2017','MON-yyyy'), 1) >= CLOSED_DATE;
除了給定的那一個月,您要所有的月嗎? 然后轉換closed_date
,並將其與給定的字符串進行比較。
select id
from table
where to_char(closed_date, 'MON-yyyy', 'nls_date_language=english') <> 'DEC-2017';
照戈登所說的做,但要稍微修改條件
讓我們創建一個示例表smple_t:
SCOTT@db>CREATE TABLE smple_t
2 AS
3 SELECT
4 ROWNUM id,
5 ( trunc(SYSDATE) + power(-1,mod(t.rndm,2) ) * t.rndm ) closed_date
6 FROM
7 (
8 SELECT
9 ROWNUM id,
10 round(dbms_random.value *-30,0) rndm
11 FROM
12 dual
13 CONNECT BY
14 level <= 400
15 ) t;
Table SMPLE_T created.
讓我們檢查記錄數:
SCOTT@db>SELECT
2 COUNT(1)
3 FROM
4 smple_t;
COUNT(1)
400
現在讓我們來看一下DEC-1-2017之前1個月到之后1個月的記錄(我假設是整個1月)。
“技巧”是確保是否要在11月的整個月中,將>=
運算符用於下邊界,將<
運算符用於上邊界:
SCOTT@db>SELECT
2 COUNT(1),
3 add_months(TO_DATE('DEC-2017','MON-YYYY'),-1) all_nov_dates,
4 add_months(TO_DATE('DEC-2017','MON-YYYY'),2) all_jan_dates
5 FROM
6 smple_t
7 WHERE
8 1 = 1
9 AND closed_date < add_months(TO_DATE('DEC-2017','MON-YYYY'),2)
10 AND closed_date >= add_months(TO_DATE('DEC-2017','MON-YYYY'),-1)
11 GROUP BY
12 add_months(TO_DATE('DEC-2017','MON-YYYY'),-1),
13 add_months(TO_DATE('DEC-2017','MON-YYYY'),2);
COUNT(1) ALL_NOV_DATES ALL_JAN_DATES
---------------------------------------------------
207 01-NOV-2017 12:00:00 AM 01-FEB-2018 12:00:00 AM
根據要求更新的附錄:
OP表示期望的結果集是2017年12月(或2016年)非截止日期。
OP指出:“應該給我2016年12月之前的所有月份編號,但不包括Dec-2016 .... Nov-16,Oct-16 ..以及另一個結果,包括除2016年12月之外的所有其他月份,即Jan-17 ,2月17日”
當我們需要不相交的結果集時(在本例中為closed_date
),我們可以使用or
運算符來實現此目標
重要的是,在條件中將closed_date
周圍的條件括起來,因為AND
具有運算符優先級。
SCOTT@db>with smple_t as
2 ( select sysdate - 90 closed_date
3 from dual
4 union all
5 select sysdate - 35 closed_date
6 from dual
7 union all
8 select sysdate + 40 closed_date
9 from dual
10 union all
11 SELECT SYSDATE - 40 closed_date
12 from dual
13 UNION ALL
14 SELECT SYSDATE + 90 closed_date
15 FROM dual
16 )
17 SELECT
18 closed_date
19 FROM
20 smple_t
21 WHERE
22 1 = 1
23 AND (
24 closed_date >= add_months(TO_DATE('DEC-2017','MON-YYYY'),1)
25 OR closed_date < TO_DATE('DEC-2017','MON-YYYY')
26 );
CLOSED_DATE
-----------------------
04-NOV-2017 03:28:17 PM
14-MAR-2018 03:28:17 PM
03-MAY-2018 03:28:17 PM
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.