簡體   English   中英

為什么我的動態to_char不起作用?

[英]Why does my dynamic to_char not work?

我想使用以下WHERE子句返回結果列表:

SELECT ... 
FROM XTABLE 
WHERE MMONTH = to_char(to_date('03/2013','mm/yyyy'),'mm')
AND MYEAR = to_char(to_date('03/2013','mm/yyyy'),'yyyy')

其中MMONTH是CHAR(3字節)類型的列,而MYEAR是CHAR(4字節)類型的列。

與之相比,為什么它不起作用

SELECT ... 
FROM XTABLE 
WHERE TO_DATE(MMONTH,'MM') = to_date(to_char(to_date('03/2012','mm/yyyy'),'mm'),'mm')
AND TO_DATE(MYEAR,'yyyy') = to_date(to_char(to_date('03/2012','mm/yyyy'),'yyyy'),'yyyy')

我不願意在右側更改日期格式('03 / 2012'),因為我還有其他使用相同日期的查詢,因此我認為只使用一種日期類型就可以了。

從Oracle文檔中,

CHAR數據類型指定固定長度的字符串。 Oracle確保存儲在CHAR列中的所有值的長度均由大小指定。 如果您插入的值短於列長度,則Oracle將值空白填充到列長度。

因此,如果在MMONTH列中插入“ 03”,則末尾將有一個空格。 to_char函數的輸出將僅返回'03',不帶任何空格。 因此,當您比較時,它將不匹配。

推薦的方法是將列的數據類型更改為VARCHAR2。 您還可以將MMONTH的列大小更改為2。

從問題的Ramblin'人的解釋上之后,如果你真的無法更改數據類型,你可以使用where trim(mmonth) =具有指標意義,或申請rpad或或castto_char SQL小提琴的所有三個選項,但我個人會去的cast為最不言自明:

SELECT ...
FROM XTABLE 
WHERE MMONTH = cast(to_char(to_date('03/2013','mm/yyyy'),'mm') as char(3))
AND MYEAR = to_char(to_date('03/2013','mm/yyyy'),'yyyy');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM