Oracle PL/SQL : Return 日期基于 oracle 中 sysdate 的日期
Oracle PL/SQL : Return date based on the day for sysdate in oracle
我有一个要求,我必须根据传递给它的 start_date 和 end_date 从数据库中选择数据。
- 如果 sysdate 是星期日,那么函数应该 return start_date 作为 YYYYMMDD 格式的星期六日期,end_date 作为 YYYYMMDD 格式的星期六日期。
- 如果 sysdate 是星期一,那么 start_date 应该是星期六,end_date 应该是星期日。
- 如果 sysdate 是星期二,那么 start_date 应该是星期六,end_date 应该是星期一..等等..
根据要求 return YYYYMMDD 格式的两个日期,函数看起来如何。
似乎开始日期始终是星期六,而结束日期是系统日期前天。
如果是这样,方法如下:
我的数据库说克罗地亚语,所以我切换到英语(并设置默认日期格式,只是为了显示 sysdate 是什么);你不必那样做。
SQL> alter session set nls_date_language = 'english';
Session altered.
SQL> alter session set nls_date_format = 'dd.mm.yyyy';
Session altered.
TEMP
CTE 模仿 sysdate 更改。 next_day
函数搜索 sysdate
之前的星期六。
2021 年 11 月 21 日是星期日,因此您希望将 2021 年 11 月 20 日作为开始日期和结束日期:
SQL> with temp as (select date '2021-11-21' sys_date from dual)
2 select
3 sys_date,
4 to_char(next_day(sys_date, 'SATURDAY') - 7, 'yyyymmdd') as start_date,
5 to_char(sys_date - 1, 'yyyymmdd') as end_date
6 from temp;
SYS_DATE START_DA END_DATE
---------- -------- --------
21.11.2021 20211120 20211120
23.11.2021 是星期二,因此您想将星期六作为开始日期,将星期一作为结束日期:
SQL> with temp as (select date '2021-11-23' sys_date from dual)
2 select
3 sys_date,
4 to_char(next_day(sys_date, 'SATURDAY') - 7, 'yyyymmdd') as start_date,
5 to_char(sys_date - 1, 'yyyymmdd') as end_date
6 from temp;
SYS_DATE START_DA END_DATE
---------- -------- --------
23.11.2021 20211120 20211122
SQL>
实际上,您只需
SQL> select
2 sysdate,
3 to_char(next_day(sysdate, 'SATURDAY') - 7, 'yyyymmdd') as start_date,
4 to_char(sysdate - 1, 'yyyymmdd') as end_date
5 from dual;
SYSDATE START_DA END_DATE
---------- -------- --------
18.11.2021 20211113 20211117
SQL>
我有一个要求,我必须根据传递给它的 start_date 和 end_date 从数据库中选择数据。
- 如果 sysdate 是星期日,那么函数应该 return start_date 作为 YYYYMMDD 格式的星期六日期,end_date 作为 YYYYMMDD 格式的星期六日期。
- 如果 sysdate 是星期一,那么 start_date 应该是星期六,end_date 应该是星期日。
- 如果 sysdate 是星期二,那么 start_date 应该是星期六,end_date 应该是星期一..等等..
根据要求 return YYYYMMDD 格式的两个日期,函数看起来如何。
似乎开始日期始终是星期六,而结束日期是系统日期前天。
如果是这样,方法如下:
我的数据库说克罗地亚语,所以我切换到英语(并设置默认日期格式,只是为了显示 sysdate 是什么);你不必那样做。
SQL> alter session set nls_date_language = 'english';
Session altered.
SQL> alter session set nls_date_format = 'dd.mm.yyyy';
Session altered.
TEMP
CTE 模仿 sysdate 更改。 next_day
函数搜索 sysdate
之前的星期六。
2021 年 11 月 21 日是星期日,因此您希望将 2021 年 11 月 20 日作为开始日期和结束日期:
SQL> with temp as (select date '2021-11-21' sys_date from dual)
2 select
3 sys_date,
4 to_char(next_day(sys_date, 'SATURDAY') - 7, 'yyyymmdd') as start_date,
5 to_char(sys_date - 1, 'yyyymmdd') as end_date
6 from temp;
SYS_DATE START_DA END_DATE
---------- -------- --------
21.11.2021 20211120 20211120
23.11.2021 是星期二,因此您想将星期六作为开始日期,将星期一作为结束日期:
SQL> with temp as (select date '2021-11-23' sys_date from dual)
2 select
3 sys_date,
4 to_char(next_day(sys_date, 'SATURDAY') - 7, 'yyyymmdd') as start_date,
5 to_char(sys_date - 1, 'yyyymmdd') as end_date
6 from temp;
SYS_DATE START_DA END_DATE
---------- -------- --------
23.11.2021 20211120 20211122
SQL>
实际上,您只需
SQL> select
2 sysdate,
3 to_char(next_day(sysdate, 'SATURDAY') - 7, 'yyyymmdd') as start_date,
4 to_char(sysdate - 1, 'yyyymmdd') as end_date
5 from dual;
SYSDATE START_DA END_DATE
---------- -------- --------
18.11.2021 20211113 20211117
SQL>