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 在周末,则返回的周一和周五将来自前一周。
我花了几天时间试图解决这个问题,但没有成功,所以希望有人能帮助我。我有一个查询日期集,其中包含多个字段,包括一列日期。我想要做的是在我的查询中创建一个新字段,告诉该行特定日期的那一周的星期一和星期五。
例如;如果我的一行中的日期是“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 在周末,则返回的周一和周五将来自前一周。