PLSQL - 如何找到给定日期一周的星期一和星期五

PLSQL - How to find Monday and Friday of the week of a given date

我花了几天时间试图解决这个问题,但没有成功,所以希望有人能帮助我。我有一个查询日期集,其中包含多个字段,包括一列日期。我想要做的是在我的查询中创建一个新字段,告诉该行特定日期的那一周的星期一和星期五。

例如;如果我的一行中的日期是“1/16/18”, 新字段应指示“1/15/18 - 1/19/18”。

所以基本上我需要能够提取 2018 年 1 月 16 日这一周的星期一日期 (1/15/18) 和星期五日期 (1/19/18),然后将两者连接起来中间有破折号 (-)。我需要为每一行执行此操作。

我到底该怎么做?我一直在努力弄清楚如何找到给定日期的星期一或星期五...

假设你的列是 date 类型,你可以使用 trunc 得到一周的第一天(星期一),然后加上 4 天得到星期五。

例如:

with yourTable(d) as (select sysdate from dual)
select trunc(d, 'iw'), trunc(d, 'iw') + 4
from yourTable

要将日期格式化为所需格式的字符串,您可以使用to_char;例如:

with yourTable(d) as (select sysdate from dual)
select to_char(trunc(d, 'iw'), 'dd/mm/yy') ||'-'|| to_char(trunc(d, 'iw') + 4, 'dd/mm/yy')
from yourTable

给出

15/01/2018-19/01/18

可能有一个更简单、规范的 Oracle 方法,但您仍然可以自行将其简化为一个简单的计算。我假设您只处理周一至周五的日期。如果您确实需要处理周末日期,那么您可能必须更明确地说明它们应该附加到哪个逻辑周。

<date> - (to_char(<date>, 'D') - 2) -- Monday
<date> + (6 - to_char(<date>, 'D')) -- Friday

原则上,您需要做的就是 add/subtract 基于当前星期几的适当天数(从 1 - 7)。那里有一些隐含的转换,更好地处理这些可能是明智的。您可能还想检查 NLS 设置,以确保您可以 to_char() 将星期日用作一周的第一天。

https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm

您还可以使用 NEXT_DAY 函数,如:

SELECT TRUNC(NEXT_DAY(SYSDATE, 'MON')) - INTERVAL '7' DAY AS PREV_MONDAY,
       TRUNC(NEXT_DAY(SYSDATE, 'FRI'))                    AS NEXT_FRIDAY
  FROM DUAL;

请注意,使用上面的方法,在周末,星期一将是当前日期之前的星期一,星期五将是当前日期之后的星期五,即这两天之间将有 11 天。

您也可以使用

SELECT TRUNC(NEXT_DAY(SYSDATE, 'MON')) - INTERVAL '7' DAY AS PREV_MONDAY,
       TRUNC(NEXT_DAY(SYSDATE, 'MON')) - INTERVAL '3' DAY AS NEXT_FRIDAY
  FROM DUAL;

在这种情况下,周一和周五将始终来自同一周,但如果 SYSDATE 在周末,则返回的周一和周五将来自前一周。