我有一个查询在两个日期(过去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
感谢。
答案 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') = 3
和to_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