2

我想使用以下 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 Bytes) 类型的列,MYEAR 是 CHAR(4 Bytes) 类型的列。

为什么与它相比不起作用

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

4

2 回答 2

2

从 Oracle 文档中,

CHAR 数据类型指定一个固定长度的字符串。Oracle 确保存储在 CHAR 列中的所有值都具有由 size 指定的长度。如果插入的值比列长度短,Oracle 会将值填充到列长度。

所以,如果你在列中插入“03” MMONTH,它的末尾会有一个空格。函数的输出to_char将简单地返回“03”,没有任何空格。因此,当您比较时,它不会匹配。

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

于 2013-10-04T05:03:50.547 回答
2

继 Ramblin' Man 对问题的解释之后,如果您真的无法更改数据类型,您可以使用where trim(mmonth) =which has index 含义,或者应用rpador orcast到您的to_char. 所有三个选项的SQL Fiddle,但我个人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');
于 2013-10-04T10:07:41.210 回答