在甲骨文YYYYMMDD到YYYYMM

时间:2014-06-12 17:32:56

标签: sql oracle

我在表中有一个DATE数据类型的列。

我正在尝试以YYYYMM格式检索列值。我的选择查询如下所示

select *
from tablename
where date column = to_char(to_date('12/31/4000','MM/DD/YYYY'),'YYYYMM');

我正处于异常之下。

  

ORA-01847:月中的某一天必须在1月到最后一天之间

感谢对此的任何意见。

5 个答案:

答案 0 :(得分:3)

我认为最简单的方法是:

where to_char(datecolumn, 'YYYYMM') = '400012'

或者,如果您愿意:

where to_char(datecolumn, 'YYYYMM') = to_char(to_date('12/31/4000', 'MM/DD/YYYY'), 'YYYYMM');

答案 1 :(得分:1)

语法方式,右手日期(等于右边)可以。但是你正在进行角色比较,而不是日期比较。 这适用于多个数据库:

select to_char (to_date('12/31/4000','MM/DD/YYYY'),'YYYYMM')
from dual;

即使您的列名为DATE_COLUMN,您也会根据查询中的字符进行比较。

所以,试试这个 - 比较基于日期(不是字符比较)并截断小时,分钟,ETC。所以你只是在比较DAY:

select * from DATE_TAB 
where TRUNC(DATE1, 'DDD') = TRUNC(to_date('12/31/4000','MM/DD/YYYY'),'DDD');

注意:上面的DATE1字段是DATE字段。如果你的DATE_COLUMN不是DATE字段,那么你必须这样做 首先将其转换为DATE数据类型(使用TO_DATE,ETC。)

答案 2 :(得分:1)

假设" date_column"实际上是一个日期,并且你在date_column上有一个索引,你可以做这样的事情来快速返回数据(不截断所有行中的日期来进行比较):

with dat as (
    select level as id, sysdate - (level*10) as date_column
    from dual
    connect by level <= 100
)
select id, date_column
from dat
where date_column between to_date('11/1/2013', 'MM/DD/YYYY') and last_day(to_date('11/2013 23:59:59', 'MM/YYYY HH24:MI:SS'))

在这里,我假设一些数据的日期可以追溯到几年。此示例选取2013年11月份中具有日期的所有行。

答案 3 :(得分:0)

如果date_column的数据类型为DATE,则使用

select *
from tablename
where TO_CHAR(date_column,'YYYYMM') = to_char (to_date('12/31/4000','MM/DD/YYYY'),'YYYYMM');

如果date_column的数据类型是VARCHAR,则使用:

select *
from tablename
where date_column = to_char (to_date('12/31/4000','MM/DD/YYYY'),'YYYYMM');

我以某种方式感觉您错误是因为您在日期和列之间有空格 “date column”。如果表格中的字段名称为“COLUMN”,那么只需从原始查询中删除“DATE”就足够了,因为:

select *
from tablename
where column = to_char(to_date('12/31/4000','MM/DD/YYYY'),'YYYYMM');

答案 4 :(得分:0)

如果您的列(YYYYMMDD)采用数字格式,获取YYYYMM的最简单方法是

select floor(DATE/100)
from tablename;