oracle 如何在oralce中获得上个月最后一个营业日

hwazgwia  于 2022-12-03  发布在  Oracle
关注(0)|答案(2)|浏览(158)

我的表中有这样的数据
2020年1月1日H
2020年1月2日B
2020年1月3日B
2020年1月4日B

2020年1月29日B
2020年1月30日H
2020年1月31日H
2020年1月2日H
2020年2月2日H
2020年2月3日B
2020年2月4日B
2020年2月5日B

现在我的问题是在本月我需要检查第三个工作日,即在这种情况下2020 - 02 - 05我需要得到上个月的最后一个工作日,即2020 - 01 - 29

dddzy1tm

dddzy1tm1#

通过添加2列:

row_number() over(partition by trunc(date_value,'MM'), day_type order by date_value) as rn_month_asc, 
row_number() over(partition by trunc(date_value,'MM'), day_type order by date_value desc) as rn_month_desc

在一个月中,第3个营业日将具有rn_month_asc=3和day_type ='B',最后一个营业日将具有rn_month_desc=1和day_type ='B',并且如果需要,易于查询其它情况。

7cwmlq89

7cwmlq892#

我需要在当月的第三个工作日检查
在Oracle 12中,您可以用途:

SELECT date_value
FROM   table_name
WHERE  TRUNC(SYSDATE, 'MM') <= date_value
AND    date_value < ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 1)
AND    day_type = 'B'
ORDER BY date_value ASC
OFFSET 2 ROWS
FETCH NEXT ROW ONLY;

其中,对于示例数据:

CREATE TABLE table_name (date_value, day_type) AS
SELECT DATE '2020-01-01', 'H' FROM DUAL UNION ALL
SELECT DATE '2020-01-02', 'B' FROM DUAL UNION ALL
SELECT DATE '2020-01-03', 'B' FROM DUAL UNION ALL
SELECT DATE '2020-01-04', 'B' FROM DUAL UNION ALL
SELECT DATE '2020-01-05', 'B' FROM DUAL UNION ALL
SELECT DATE '2020-01-28', 'B' FROM DUAL UNION ALL
SELECT DATE '2020-01-29', 'B' FROM DUAL UNION ALL
SELECT DATE '2020-01-30', 'H' FROM DUAL UNION ALL
SELECT DATE '2020-01-31', 'H' FROM DUAL UNION ALL
SELECT DATE '2020-01-02', 'H' FROM DUAL UNION ALL
SELECT DATE '2020-02-02', 'H' FROM DUAL UNION ALL
SELECT DATE '2020-02-03', 'B' FROM DUAL UNION ALL
SELECT DATE '2020-02-04', 'B' FROM DUAL UNION ALL
SELECT DATE '2020-02-05', 'B' FROM DUAL;

如果当前月份为2020-01,则输出为:
| 日期值|
| - -|
| 2020年1月4日|
我需要获取上个月的最后一个工作日

SELECT date_value
FROM   table_name
WHERE  ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1) <= date_value
AND    date_value < TRUNC(SYSDATE, 'MM')
AND    day_type = 'B'
ORDER BY date_value DESC
FETCH FIRST ROW ONLY;

如果当前月份为2020-02,则输出为:
| 日期值|
| - -|
| 2020年1月29日|
fiddle

相关问题