我在表中有一个DATE数据类型的列。
我正在尝试以YYYYMM格式检索列值。我的选择查询如下所示
select *
from tablename
where date column = to_char(to_date('12/31/4000','MM/DD/YYYY'),'YYYYMM');
我正处于异常之下。
ORA-01847:月中的某一天必须在1月到最后一天之间
感谢对此的任何意见。
答案 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;