我花了几天时间试图弄清楚这一点无济于事,所以希望有人可以帮助我。我有一个查询日期集,其中包含几个字段,包括一列日期。我想要做的是在我的查询中创建一个新字段,告诉该行的特定日期周的星期一和星期五。
所以例如;如果我的一行中的日期是“1/16/18”, 新字段应标明“1/15/18 - 1/19/18”。
所以基本上我需要能够提取周一日期(1/15/18)和星期五日期(1/19/18)的1/16/18周,然后用破折号将两者连接起来介于两者之间。我需要为每一行做这件事。
我该怎么做?我一直在努力想弄清楚如何找到给定日期的星期一或星期五......
答案 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是在周末,则返回的星期一和星期五将来自上周。