繁体   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