我想对下面给出的日期使用正确的日期函数,该日期在Oracle SQL查询下面是硬编码的

时间:2016-09-12 02:04:41

标签: sql oracle

我有以下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的内置函数来自动化从数据库中获取上周六数据的过程。

2 个答案:

答案 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设置如何。