2017-08-09 29 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