我有这个问题的数据库:在Oracle和Netezza上。
问题:我有一个字符串:16101211213。此字符串表示:YYMMDDHH24MMSS。我需要将其转换为日期格式YYYY-MM-DD HH24:MM:SS。所以在路上我需要添加两个数字(在字符串前面)。我知道日期是二十一世纪。所以我需要在20岁开始。所以结果我应该得到2016-10-12 21:12:13
有人可以帮我吗?我尝试了很多选项(主要是在Netezza上),但无法弄明白。
提前多多感谢!
答案 0 :(得分:1)
RR可能是你的救世主。
SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';
Session altered.
SQL> with test as (select '16101211213' datum from dual)
2 select to_date(datum, 'rrmmddhh24miss') result
3 from test;
RESULT
-------------------
12.10.2016 11:21:03
SQL>
哦, - 小心!您使用错误的格式掩码几分钟;它是" MI"而不是" MM" (这是月)。
[编辑:使用不同的格式掩码显示结果]
SQL> with test as (select '16101211213' datum from dual)
2 select
3 to_date(datum, 'rrmmddhh24miss') result_1,
4 to_char(to_date(datum, 'rrmmddhh24miss'), 'mm/dd/yyyy hh:mi:ss am') result_2
5 from test;
RESULT_1 RESULT_2
------------------- ----------------------
12.10.2016 11:21:03 10/12/2016 11:21:03 AM
SQL>
答案 1 :(得分:1)
您可以通过转换为YY或RR format model elements来回复Oracle推断年份,或者连接世纪值并使用YYYY。
如果您确定日期都在21世纪,那么使用连接和YYYY:
to_date('20' || tistamp, 'yyyymmddhh24miss')
的行为与使用YY(使用当前日期来决定世纪)相同:
to_date(tistamp, 'yymmddhh24miss')
如果所有年份都低于50,则RR(which uses the current date's century or the last century depending on the supplied 2-digit year)也会得到相同的结果:
to_date(tistamp, 'rrmmddhh24miss')
但如果任何值为50或以上RR且YY / YYYY表现不同。由于这些似乎是事件时间戳,它们不太可能在未来,但差异可能仍然有一天重要。 (但最后,假设21世纪也可能无效......)
通过CTE提供差异的快速演示,使用您的样本值和其他几个:
alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS';
with your_table(tistamp) as (
select '16101211213' from dual
union all select '491231235959' from dual
union all select '500101000000' from dual
)
select to_date('20' || tistamp, 'yyyymmddhh24miss') as yyyy,
to_date(tistamp, 'yymmddhh24miss') as yy,
to_date(tistamp, 'rrmmddhh24miss') as rr
from your_table;
YYYY YY RR
------------------- ------------------- -------------------
2016-10-12 11:21:03 2016-10-12 11:21:03 2016-10-12 11:21:03
2049-12-31 23:59:59 2049-12-31 23:59:59 2049-12-31 23:59:59
2050-01-01 00:00:00 2050-01-01 00:00:00 1950-01-01 00:00:00
所有这些当然也适用于to_timestamp()
;因为您没有小时秒或时区信息使用日期应该没问题,只要您的客户知道Oracle日期有时间组件。