2017-08-09 28 views
-1

我有一个查询返回两个日期(最后4周)和下午2点到12点之间的结果: 如何筛选以仅返回星期二?返回SQL仅适用于星期二

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' 

这一个为我工作(感谢凯斯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

To_timestamp()是Oracle内置函数。如果你在sql server中执行该命令,你会得到To_timestamp'不是一个公认的内置函数名称 –

+0

是的@ OLIVER.KOO很好。 OP,您应该能够以类似的方式在DAY_OF_WEEK中使用EXTRACT。 https://docs.oracle.com/cd/E37483_01/server.751/es_eql/src/ceql_functions_date_extract.html –

+0

而我刚刚注意到,我的上述查询在午夜之后给了我时间,我只希望在下午2点和午夜之间。 – user1034127

回答

1

刚刚加入到其中

to_char(create_time,'d') = 3 
+0

此查询的结果因当前用户会话Nls_TERRITORY设置而异。 –

1

添加以下where子句谓词:

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

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

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

+0

该查询的结果因当前用户会话Nls_Date_LANGUAGE设置而异。 –

+0

西部数据做得很好;你可能需要改变'tue'这个词来适应你安装目标的语言。如果您的系统将安装在多个区域设置中,则可能需要用to_char(to_date('19700106','yyyymmdd'),'dy',)或其他某个已知的星期二的特定日期替换'tue',例如1970年1月6日 –

+0

我认为更好的方法是使用nlsparam参数https://docs.oracle.com/database/121/SQLRF/functions216.htm#SQLRF06129 –

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