首页 > 解决方案 > 如何将 2020-08-20T12:02:02Z 日期转换为 DD-MM-YYYY sql?

问题描述

我想在 oracle 数据库中将“2020-08-20T12:02:02Z”日期转换为 DD-MM-YYYY。日期应类似于 20-08-2020。请指教。

标签: sqloracle

解决方案


TL;DR:TO_CHAR( column_name, 'DD-MM-YYYY' )用于明确格式化您的DATE列。


DATE没有格式;它在内部存储为 7 字节(分别为世纪、世纪、月、日、小时、分钟和秒)。直到用户界面尝试显示日期,显示的值才会根据NLS_DATE_FORMAT会话参数隐式格式化(这可以由任何用户在他们自己的会话中随时设置,因此多个用户可以有多种日期格式,并且这些隐式格式可以在会话中更改,因此您永远不应该依赖隐式格式来提供一致的输出)。

因此,如果您有 aDATE并且它的值是,2020-08-20T12:02:02Z那么您需要做的就是在显示它时对其进行格式化(使用TO_CHAR)以不显示时间组件:

CREATE TABLE table_name (
  column_name DATE
);

INSERT INTO table_name ( column_name )
  VALUES ( DATE '2020-08-20' + INTERVAL '12:02:02' HOUR TO SECOND );

设置日期的隐式格式:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD"T"HH24:MI:SS"Z"';

然后:

SELECT column_name AS with_implicit_formatting,
       TO_CHAR( column_name, 'DD-MM-YYYY' ) AS with_explicit_formatting
FROM   table_name;

输出:

WITH_IMPLICIT_FORMATTING | WITH_EXPLICIT_FORMATTING
:------------------------ | :------------------------
2020-08-20T12:02:02Z | 20-08-2020              

db<>在这里摆弄


注意:Z格式模型暗示 Zulu ( UTC+0) 时区。但是,日期不存储时区;因此,如果您想存储此时区信息,那么您应该使用TIMESTAMP WITH TIME ZONE数据类型而不是 a (并且在将日期时间值从本地时区转换为应用正确时区DATE时,您可能需要格外小心UTC+0要转换为的偏移量,UTC+0并且不要只采用日期时间组件并忽略本地时区。


推荐阅读