2013-07-26 54 views
1

我有以下查詢:Oracle查詢串連日期

select * 
    from mytable 
where to_char(mydate,'mm/dd/yyyy') between ('05/23/2013') 
             and ('06/22/2013') 

我需要改變它動態地做,這樣我不會每個月都修改它從05/23/201306/23/2013例如:

('05/23/' + (select to_char(sysdate, 'yyyy') from dual)) 

但這是一個錯誤,有什麼建議嗎?

什麼,我需要做的:每個月我需要運行該查詢這個月的23和最後一個月的23間得到的記錄

+1

你能描述一下你正在試圖用言語來呢?目前的描述沒有意義 - 爲什麼你會每個月更改一年的價值? –

+0

每月我需要運行此查詢以獲取本月23日和上月23日之間的記錄 –

+0

如果今天是2013-05-12,那麼您希望包含的最早日期和時間是什麼,是最新的日期和時間? –

回答

3

Oracle使用||concatenation operator

('05/23/' || (select to_char(sysdate, 'yyyy') from dual)) 

順便說一句,大衛是對的。如果你真的想比較日期的字符串表示(但是爲什麼呢?),請使用排序方式相同日期的日期格式:

to_char(mydate,'yyyy/mm/dd') 
+0

這是最好的答案 –

4

您正在執行對字符串的比較,而不是日期,所以你的代碼不能像你認爲的那樣工作。

根據字符串邏輯,「05/23/2000」介於「05/22/2013」​​和「06/24/2000」之間。

將數據類型保留爲date,Oracle將得到比較權限。

也許你想要的是:

select * 
from my_table 
where mydate >= add_months(trunc(sysdate,'MM'),-1)+22 and 
     mydate < trunc(sysdate,'MM')+22 

但很難說沒有什麼要求實際上是一個描述。

+0

這是一個錯誤,日期格式無法識別。 –

+0

將'M'更改爲'MM' –

+0

現在不給予有效月份和mydate類型日期 –

0

這個怎麼樣?

SELECT '(''05/23/'''||to_char(sysdate, 'yyyy')||'''' FROM DUAL 

有沒有testet因爲我沒有Oracle數據庫,現在,需要檢查報價逃逸......

你從每月需要確切的日子嗎?您也可以從SYSDATE天。減去:

SELECT (sysdate - 30) FROM DUAL 
0

您也可以使用concat函數

concat('05/23/', (select to_char(sysdate, 'yyyy') from dual))