我有以下"时间戳"在专栏
中Mon Aug 10 12:24:46 CDT 2016
所以为了转换成日期,我正在做以下事情。
select * from
(select TO_DATE(SUBSTR(t.timestamp,9,2) || '-' || SUBSTR(t.timestamp,5,3) ||
'-' || SUBSTR(t.timestamp,27,2), 'DD-MON-YY') from table t where
t.LENGTH(TRIM(t.timestamp)) = 28 as date) where date <= sysdate;
这样做的原因是,&#34; Oracle sysdate&#34;以下列格式返回当前日期
20-SEP-16
因此,为了比较oracle sysdate,我正在使用上述方法。
有没有更好的方法来做到这一点,我知道在select语句中使用一组子字符串并且因为我的&#34;时间戳&#34;这是低效的。值太长,我无法转换为ORACLE日期。
我使用oracle 11作为我的数据库。任何帮助表示赞赏。
答案 0 :(得分:3)
这是一个概念证明,假设所谓的“时间戳”实际上是一个字符串。如果它是带有时区的正确时间戳(因为它应该),那么它甚至更简单,您可以直接与日期进行比较。
注意两件事:在我的映射中,由于某些原因我没有“CDT”,但我确实有标准的时区,CST。我可能错过了夏令时文件,我不在乎追捕和安装。 2016年8月10日是星期三;周一不行,你不能骗过Oracle。不知道为什么你不打算使用实际的正确日期(包括一周中正确的日期)。
编辑:实际上我没有遗漏任何“时区代码文件”;相反,要将CDT识别为有效时区,下面模型中的TZR组件需要更改为TZD。
概念证明:
select 'x' as col1
from dual
where to_timestamp_tz('Wed Aug 10 12:24:46 CST 2016',
'Dy Mon dd hh24:mi:ss TZR yyyy') <= sysdate
;
COL1
-----
x
1 row selected.
答案 1 :(得分:1)
as date
位置错误。 to_char
中指定该语言,以确保其独立于您当前的设置。以下是查询:
select *
from
(
select
cast(from_tz(cast("date" as timestamp), zone) at time zone 'CDT' as date) as "date"
from
(
select to_date(substr(t.timestamp,9,2) || '-' ||
substr(t.timestamp,5,3) || '-' ||
substr(t.timestamp,25,4),
'DD-MON-YY',
'NLS_DATE_LANGUAGE=AMERICAN') as "date",
substr(t.timestamp,21,3) as zone
from table t
where t.length(trim(t.timestamp)) = 28
)
)
where "date" <= sysdate;
尽管其名称from_tz
并未从时区转换,但是从时间戳转换时区到时间戳 时区。因此我们使用它来将我们的时区信息放入。timestamp at time zone 'xyz'
另一方面将时区移动到指定的时区(我们解释我们的日期驻留的时区)。 cast
用于从日期到时间戳,反之亦然。
答案 2 :(得分:-2)
您可以使用TO_CHAR函数提取日期格式 documentation