【问题标题】:How to convert string to date format when string has only two digits for a year (Oracle, Netezza)当字符串一年只有两位数时如何将字符串转换为日期格式(Oracle,Netezza)
【发布时间】:2018-06-20 15:31:24
【问题描述】:

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

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

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

提前非常感谢!

【问题讨论】:

  • 请阅读stackoverflow.com/help/how-to-ask并分享您的尝试
  • 对不起,但我不知道这个问题有什么问题......我搜索了相关的主题,但找不到解决方案......

标签: database string oracle date netezza


【解决方案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>

【讨论】:

  • 谢谢,但是它在一半(在 Netezza 上)可以正常工作。当我运行查询时:'SELECT to_date (TISTAMP, 'yymmddhh24miss') FROM TABLE' 在结果中我有: 2016-04-22 00:00:00 for TIMESTAMP '160422181600'。时间被切断。知道为什么吗?除此之外:数据库如何知道年份应该是 2016 年?但不是1916?谢谢
  • @mikikiki - 这样可以节省时间;你是如何运行/显示这个的?也许 Netezza 将其作为“ANSI”日期而浪费时间 - 使用 to_timestamp() 有什么不同吗? (另外......在格式掩码中使用 YY 会使它们成为当前世纪,这似乎是您想要的;使用 RR 将 49 岁以上的年份视为上个世纪。这对您的数据可能无关紧要。)跨度>
  • @Littlefoot - 您的查询适用于 Oracle,另一方面适用于 Netezza:to_timestamp(TISTAMP_VDA, 'yymmddhh24miss')。转换日期为 2015-07-07 20:33:38 太棒了!!!顺便说一句:rr 不适用于 Netezza。如果可以的话,还有一个问题,虽然现在我有一个日期格式,但我的另一个问题是如何将部分日期的位置更改为 MM/DD/YYYY HH:MI:SS?改变面具在这里没有帮助。
  • @miki kiki,我修改了我的消息,看看;基本上,应该将 TO_CHAR 函数应用于前一个 (TO_DATE) 的结果,以便根据需要显示结果。除此之外,您应该修改 NLS 设置并设置不同的(默认)格式掩码。
  • @mikikiki 如果此答案对您有用,请将其标记为解决方案
【解决方案2】:

您可以回复 Oracle 通过使用 YY 或 RR format model elements 转换来推断年份,或者连接世纪值并使用 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 日期有时间组件。

【讨论】:

  • 您好,谢谢,它适用于 Oracle。在 Netezza 上不起作用 rr。您是否知道如何更改日期中日期组件的位置(将月份放在第一个位置)?更换面具没有帮助。
  • 我对 Netezza 一无所知 *8-) 我认为您正在询问如何使 Netezza 以特定方式格式化日期/时间 - 我不知道该怎么做。您可以使用该掩码将日期转换为指定格式的字符串;但不确定这是否受支持,它会影响事物的显示方式(例如,重新排序结果)。
猜你喜欢
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多