我的来源来自Oracle,col1是varchar2(26),但值看起来像YYYY-MM-DD-hh:mi:ss:ff(样本rec:2014-08-15-02.03.34.979946)。 我必须根据COL1提取仅6个月的记录。由于日期部分和时间部分之间存在超标 - 我不能将其视为时间戳。有没有想法如何将其作为时间戳来查找仅6个月的数据。
答案 0 :(得分:2)
如果可以,请先修复数据。在字符串数据类型中存储时间戳非常糟糕。你怎么知道你没有25:30:00的时间?或者像2月30日这样的日期?此外,你无法在该列上真正使用索引(因此查询速度非常慢),每当引用该列时都必须编写大量代码。
无论如何 - 要处理眼前的问题,请使用TO_TIMESTAMP()
,完全使用您在帖子中显示的格式模型 - 包括日期部分和时间部分之间的短划线。像这样:
select case when to_timestamp('2014-08-15-02.03.34.979946', 'YYYY-MM-DD-HH24:MI:SS.FF')
>= systimestamp - interval '6' month
then 'TRUE' else 'FALSE' end
as result
from dual;
RESULT
------
FALSE
编辑:正如Alex Poole在本答案下面的评论中指出的那样(正如一如既往),interval
算术在所有情况下都无法正常工作。比使用像
cast ( timestamp (...., format-model) as date ) <= add_months (sysdate, -6).
答案 1 :(得分:0)
也许这样的事情可以做到:
select *
from your_table
where to_date(substr(col1,1,19),'yyyy-mm-dd-HH24.MI.SS') between add_months(sysdate,-6) and sysdate;
假设col1中的所有数据格式始终相同。
另请注意,我使用HH24作为小时段,但可能不是你的情况。
答案 2 :(得分:0)
您可以在格式模型中包含短划线,如@mathguy所示,将字符串转换为时间戳:
select to_timestamp('2014-08-15-02.03.34.979946', 'YYYY-MM-DD-HH24:MI:SS.FF') from dual;
TO_TIMESTAMP('2014-08-15-02.
----------------------------
15-AUG-14 02.03.34.979946000
虽然除非您明确告诉它不是通过FX
修饰符,否则Oracle足够灵活,即使模型有空格也允许破折号(请参阅下面的文字this table in the documentation:
select to_timestamp('2014-08-15-02.03.34.979946', 'YYYY-MM-DD HH24:MI:SS.FF') from dual;
TO_TIMESTAMP('2014-08-15-02.
----------------------------
15-AUG-14 02.03.34.979946000
但是,转换col1
列中的所有值然后比较它们可能会有很多工作,并且会阻止使用该字符串列上的任何索引。给定格式,您可以将日期范围转换为字符串,并使用字符串比较;例如在今天早上六个月到午夜找到所有东西:
select col1 -- or whichever columns you need
from your_table
where col1 >= to_char(cast(add_months(trunc(sysdate), -6) as timestamp), 'YYYY-MM-DD-HH24:MI:SS.FF6')
and col1 < to_char(cast(trunc(sysdate) as timestamp), 'YYYY-MM-DD-HH24:MI:SS.FF6');
或者由于该示例的时间部分可以修复,因此您可以使用字符文字而不是强制转换:
select col1 -- or whichever columns you need
from your_table
where col1 >= to_char(add_months(sysdate, -6), 'YYYY-MM-DD"-00:00:00.000000"')
and col1 < to_char(sysdate, 'YYYY-MM-DD"-00:00:00.000000"');
当然,以正确的原生数据类型存储数据将是一个更好的解决方案。如果您的字符串数据实际上包含您的想法,并且数据全部合理(或者在错误的数据类型中可以理智),任何其他解决方案都可以正常工作。