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

时间:2018-01-16 19:09:22

标签: sql oracle date dayofweek weekday

我花了几天时间试图弄清楚这一点无济于事,所以希望有人可以帮助我。我有一个查询日期集,其中包含几个字段,包括一列日期。我想要做的是在我的查询中创建一个新字段,告诉该行的特定日期周的星期一和星期五。

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

所以基本上我需要能够提取周一日期(1/15/18)和星期五日期(1/19/18)的1/16/18周,然后用破折号将两者连接起来介于两者之间。我需要为每一行做这件事。

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

3 个答案:

答案 0 :(得分:2)

假设您的列属于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

答案 1 :(得分:0)

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

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

原则上,您需要做的是根据当前的一周(从1到7)添加/减去适当的天数。那里有一些隐含的演员阵容,处理好这些演员可能是明智之举。您可能还需要检查NLS设置,以确保您可以依赖to_char()将星期日作为一周的第一天。

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

答案 2 :(得分:0)

您还可以使用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是在周末,则返回的星期一和星期五将来自上周。