【问题标题】:Oracle PL/SQL : Return date based on the day for sysdate in oracleOracle PL/SQL:返回日期基于 Oracle 中 sysdate 的日期
【发布时间】:2021-12-29 09:16:11
【问题描述】:

我有一个要求,我必须根据传递给它的 start_date 和 end_date 从数据库中选择数据。

  • 如果 sysdate 是星期日,则函数应以 YYYYMMDD 格式返回 start_date 作为星期六的日期,并将 end_date 作为 YYYYMMDD 格式的星期六日期返回。
  • 如果 sysdate 是星期一,那么 start_date 应该是星期六,end_date 应该是星期日。
  • 如果 sysdate 是星期二,那么 start_date 应该是星期六的日期,而 end_date 应该是星期一......等等......

函数将如何根据请求以 YYYYMMDD 格式返回两个日期。

【问题讨论】:

  • 我不完全明白你在做什么,首先你说这个函数需要两个入口数据:start_date和end_date,然后你说根据当前返回两个带有条件的日期日期。您是否希望该函数根据当前日期将 start_date 和 end_date 修改为另一个日期?还是您想仅根据当前日期计算 start_date 和 end_date,并且不将任何日期作为输入数据传递给函数?
  • 在我之前的评论之后,如果您正在尝试我之前所说的第一个选项,您想要什么日期作为数据的输出,start_date 的相同日期或最近的上一个星期六,例如,如果 start_date 2021/11/18(星期四)作为您想要 20211113 或下一个可用星期六的 start_date 的输出:在我的示例中为 20211120。如果 start_date 是星期六 (2021/11/13) 而 current_date 是星期六会怎样? end_date 的类似问题。
  • 请澄清您的具体问题或提供更多详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: sql oracle date plsql


【解决方案1】:

开始日期似乎总是星期六,而结束日期是 sysdate 的前一天

如果是这样,方法如下:

我的数据库说克罗地亚语,所以我切换到英语(并设置默认日期格式,只是为了显示 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 之前的星期六。

21.11.2021 是星期日,因此您希望将 20.11.2021 作为开始和结束日期:

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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    相关资源
    最近更新 更多