当字符串一年只有两位数时,如何将字符串转换为日期格式(Oracle,Netezza)

时间:2018-01-11 10:24:42

标签: database string oracle date netezza

我有这个问题的数据库:在Oracle和Netezza上。

问题:我有一个字符串:16101211213。此字符串表示:YYMMDDHH24MMSS。我需要将其转换为日期格式YYYY-MM-DD HH24:MM:SS。所以在路上我需要添加两个数字(在字符串前面)。我知道日期是二十一世纪。所以我需要在20岁开始。所以结果我应该得到2016-10-12 21:12:13

有人可以帮我吗?我尝试了很多选项(主要是在Netezza上),但无法弄明白。

提前多多感谢!

2 个答案:

答案 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日期有时间组件。