仅在星期二返回SQL

时间:2017-08-09 19:46:24

标签: sql oracle

我有一个查询在两个日期(过去4周)和下午2点到12点之间返回结果: 如何过滤只返回星期二?

  SELECT * 
    FROM   monitor_files 
    WHERE  trfr_type IN ( 'FTE', 'SFTP' ) 
           AND create_time >= To_timestamp('20170718 140000', 'YYYYMMDD HH24:MI:SS') 
           AND create_time < To_timestamp('20170819 000000', 'YYYYMMDD HH24:MI:SS') 
           AND trfr_status = 'C' 

这个对我有用(感谢Caius Jard):

select * 
from monitor_files 
where trfr_type in ('FTE', 'SFTP') 
      AND CREATE_TIME >= TO_TIMESTAMP('20170718 140000', 'YYYYMMDD HH24:MI:SS') 
      AND CREATE_TIME < TO_TIMESTAMP('20170819 000000', 'YYYYMMDD HH24:MI:SS') 
      AND TRFR_STATUS ='C' AND to_char(create_time, 'dy') = 'tue' 
      AND extract(hour from CAST(create_time as timestamp))  BETWEEN 14 AND 23 

感谢。

3 个答案:

答案 0 :(得分:1)

添加以下where子句谓词:

AND to_char(create_time, 'dy') = 'tue'
AND extract(hour from CAST(create_time as timestamp))  BETWEEN 14 AND 23

据我所知,在oracle中,提取物不能用于获取星期几。它也不能用于获取日期时间类型的小时,它必须是另一种类型,例如时间戳 - 如果你的create_time是时间戳,你可以省略强制转换。

https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions052.htm#SQLRF00639

答案 1 :(得分:1)

只需加入

to_char(create_time,'d') = 3

答案 2 :(得分:0)

通常to_char(create_time, 'd') = 3to_char(create_time, 'dy') = 'tue'正在运行,但它们依赖于当前用户会话NLS设置。

to_char(..., 'd')返回工作日。但是,第一个工作日取决于NLS_TERRITORY。例如,美国的第一天是星期日,而欧洲的第一天是星期一。在阿拉伯文化中,星期六通常被视为一周的第一天。因此,除非您检查/设置NLS_TERRITORY,否则to_char(..., 'd')的结果未确定,请参阅示例:

alter session set nls_territory = 'america';
select to_char(sysdate,'d') from dual;

TO_CHAR(SYSDATE,'D')
6

alter session set nls_territory = 'germany';
select to_char(sysdate,'d') from dual;

TO_CHAR(SYSDATE,'D')
5

同样适用于to_char(..., 'dy')。我依赖NLS_DATE_LANGUAGE,见示例:

alter session set nls_date_language = 'american';
select to_char(sysdate-3,'day') from dual;

TO_CHAR(SYSDATE-3,'DAY')
tuesday  

alter session set nls_date_language = 'french';
select to_char(sysdate-3,'day') from dual;

TO_CHAR(SYSDATE-3,'DAY')
mardi   

为了独立于NLS_DATE_LANGUAGE,您应该使用

to_char(create_time,'dy', 'NLS_DATE_LANGUAGE = american') = 'tue'

注意,如果未设置NLS_DATE_LANGUAGE,则该值来自NLS_TERRITORY。如果未设置NLS_TERRITORY,则该值来自NLS_LANG,请参阅Setting Up a Globalization Support Environment