我有以下Oracle SQL查询。
select p_name,
cal_vale,
St_val,
l_date
from pr_tab
where L_date = to_date('03-sep-16','dd-mon-yy');
此处03-Sep-16
是硬编码日期值,用于从数据库中捕获上周六的数据。
我不想继续使用这个硬编码值。我需要一些Oracle的内置函数来自动化从数据库中获取上周六数据的过程。
答案 0 :(得分:2)
您可以使用NEXT_DAY()
功能:
SELECT NEXT_DAY( TRUNC( SYSDATE ) - INTERVAL '8' DAY, 'SATURDAY' )
FROM DUAL;
(注意:你需要在8天前找到下一个星期六,如果今天是星期六,那么如果你从7天前找到下一个星期六,你将会回到今天。)
答案 1 :(得分:1)
从日期格式说明符'D'开始,指定星期几,介于1和7之间。一个问题是Oracle返回的内容取决于NLS_TERRITORY设置,因此它可能是星期日,星期一(或者我认为是星期六)。
假设值为1代表星期日,就像在北美一样。
例如,在星期四,to_number(to_char(sysdate,'D'))返回5.
sysdate - to_number(to_char(sysdate, 'D'))
返回上周六的任何一天的日期。
这仅适用于根据NLS_TERRITORY设置,一周中的第一天(1)为星期日。
例如,如果1表示星期一,则上周六为sysdate - to_number(to_char(sysdate, 'D'))-1
更好的方法是在查询中对nls_date_language设置进行硬编码,并从日期名称获取日期偏移量:
select case to_char (sysdate, 'FmDay', 'nls_date_language=english')
when 'Monday' then 2
when 'Tuesday' then 3
when 'Wednesday' then 4
when 'Thursday' then 5
when 'Friday' then 6
when 'Saturday' then 7
when 'Sunday' then 1
end d
from dual
所以
sysdate -case to_char (sysdate, 'FmDay', 'nls_date_language=english')
when 'Monday' then 2
when 'Tuesday' then 3
when 'Wednesday' then 4
when 'Thursday' then 5
when 'Friday' then 6
when 'Saturday' then 7
when 'Sunday' then 1
end
可靠地为您提供上周六的任何一天的日期,无论NLS设置如何。