为什么我的动态to_char不起作用?

时间:2013-10-04 04:30:34

标签: sql oracle

我想使用以下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')的格式,因为我有其他使用相同日期的查询,因此我认为只使用一种类型的日期会很好。

2 个答案:

答案 0 :(得分:2)

从Oracle文档中

  

CHAR数据类型指定固定长度的字符串。 Oracle确保存储在CHAR列中的所有值都具有size指定的长度。如果插入的值小于列长度,则Oracle会将值空白填充到列长度。

所以,如果你插入' 03'进入MMONTH列,最后会有一个空格。 to_char函数的输出将简单地返回' 03'没有任何空间。因此,当你比较时,它不会匹配。

推荐的方法是将列的数据类型更改为VARCHAR2。您还可以将MMONTH的列大小更改为2。

答案 1 :(得分:2)

继Ramblin'Man对问题的解释之后,如果你真的无法改变数据类型,你可以使用具有索引含义的where trim(mmonth) =,或者应用rpad或者{{1你的castSQL Fiddle这三个选项中的{{3}},但我个人认为to_char是最不言自明的:

cast