一、上個月的每一天
SELECT
LAST_DAY (ADD_MONTHS(SYSDATE ,- 1)) - (ROWNUM - 1) s_date
FROM
dual CONNECT BY ROWNUM <= (
TO_CHAR (
LAST_DAY (ADD_MONTHS(SYSDATE ,- 1)),'dd'
)
)
查出的結果如下圖所示,下圖只展示了部分日期。如需查找上兩個月,只需將ADD_MONTHS中的-1改成-2即可,依次類推。
注:
本月最後一天:
SELECT LAST_DAY (SYSDATE ) FROM dual
上月最後一天
SELECT LAST_DAY (ADD_MONTHS(SYSDATE ,- 1)) FROM dual
本月總天數
select TO_CHAR (LAST_DAY (SYSDATE ),'dd' ) from dual
上月的總天數
select TO_CHAR (LAST_DAY (ADD_MONTHS(SYSDATE ,- 1)),'dd' ) from dual
二、上週每一天
SELECT
trunc(sysdate,'iw') -1 - (ROWNUM - 1) s_date
FROM
dual CONNECT BY ROWNUM <= 7
查出的結果如下圖所示。如需查找上上週,只需將trunc後面的-1改成-2即可,依次類推。
注:
每週的星期一:
select trunc(sysdate,'iw') from dual;
三、本年每個月
select add_months(trunc(sysdate,'yyyy'), (rownum - 1)) AS RQ from dual CONNECT BY rownum <= 12
四、統計本年每個月提交的訂單數量
例如,有一張表,叫TB_ORDER,裏面有個創建時間字段CREATE_TIME。
1、現在需要統計本年每個月提交的訂單數量,則SQL如下:
SELECT TO_CHAR (RQ, 'YYYY/MM') AS RQ, NVL(value, 0)
FROM
(
(
select add_months(trunc(sysdate,'yyyy'), (rownum - 1)) AS RQ from dual CONNECT BY rownum <= 12
) t1
LEFT JOIN (
SELECT COUNT (*) AS VALUE, TRUNC (CREATE_TIME, 'mm') AS TJSJ
FROM
TB_ORDER
GROUP BY TRUNC (TJSJ, 'mm')
) t2 ON TO_CHAR (t1.RQ, 'YYYYMM') = TO_CHAR (t2.TJSJ, 'YYYYMM')
)
ORDER BY RQ
2、統計上週每天提交的訂單數量,則SQL如下:
SELECT TO_CHAR (RQ, 'MM/DD') AS RQ, NVL (VALUE, 0)
FROM
(
(
SELECT TRUNC (SYSDATE, 'iw') - 1 - (ROWNUM - 1) RQ
FROM dual CONNECT BY ROWNUM <= 7
) t1
LEFT JOIN (
SELECT COUNT (*) AS VALUE, TRUNC (CREATE_TIME, 'dd') AS TJSJ
FROM TB_ORDER
GROUP BY TRUNC (TJSJ, 'dd')
) t2 ON TO_CHAR (t1.RQ, 'YYYYMMDD') = TO_CHAR (t2.tjsj, 'YYYYMMDD')
)
3、統計上月每天提交的訂單數量,則SQL如下:
SELECT TO_CHAR (RQ, 'MM/DD') AS RQ, NVL (VALUE, 0)
FROM
(
(
SELECT TRUNC (SYSDATE, 'iw') - 1 - (ROWNUM - 1) RQ
FROM dual CONNECT BY ROWNUM <= 7
) t1
LEFT JOIN (
SELECT COUNT (*) AS VALUE, TRUNC (CREATE_TIME, 'dd') AS TJSJ
FROM TB_ORDER
GROUP BY TRUNC (TJSJ, 'dd')
) t2 ON TO_CHAR (t1.RQ, 'YYYYMMDD') = TO_CHAR (t2.tjsj, 'YYYYMMDD')
)
五、函數解釋
1、NVL (VALUE, 0):即nvl(a, b)函數,a可以是一個值或者一個表達式,當a的值爲假時,則以b的值代替此值,類似java的三目運算符。在上述SQL中起到的作用是,當VALUE的值爲null時,則以0代替。
2、TO_CHAR (RQ, ‘MM/DD’):即to_char(a, b),將逗號左邊的數據以逗號右邊的形式格式化爲字符串。
3、TRUNC():截取日期或數字,返回指定的值。
4、add_months(a, b):在a的基礎上進行加月數、減月數的操作,Y的值爲負數則是減,如a中的月份是7月,b的值爲1,則是8月,b的值爲-1,則是6月。
5、SYSDATE:系統當前時間。
6、DUAL:oracle的虛擬表,主要用來選擇系統變量或求一個表達式的值,用來構成select的語法規則。