Oracle - 以不产生输入日期格式的格式插入日期

问题描述 投票:0回答:1

我正在使用下面的插入语句在表

submissions
中输入记录,其中
submission_date
数据类型的
date
列:

insert into submissions 
values (to_date('2016-03-01', 'yyyy-mm-dd'), 8494, 20703, 0);

在从提交中查询

submission_date
时,我得到以下结果:

01-MAR-16

而我想要

submission_date
返回为
2016-03-01

问题出在哪里?

还有查询

SELECT to_char(submission_date, 'yyyy-mm-dd') 
FROM submissions

结果为

2016-03-01
,而查询

SELECT to_date(submission_date, 'yyyy-mm-dd') 
FROM submissions

结果

01-MAR-16

为什么相同的日期格式会得到不同的结果?

sql date oracle-sqldeveloper to-date sql-date-functions
1个回答
0
投票

Oracle 使用内部表示进行存储(占用 7 个字节;您可以在其他地方看到它的结构,但通常不需要关心细节)。存储的日期没有固有的人类可读格式。无论您如何插入它,它都会以相同的方式存储,而不是使用任何显示格式。

当您只查询日期列时:

SELECT submission_date
FROM submissions

数据库返回其内部表示,您的客户端决定如何显示它。在大多数客户端中,它将使用您的会话 NLS 设置,特别是此处的

NLS_DATE_FORMAT
。根据您的结果
01-MAR-16
,看起来是
DD-MON-RR

而我希望submission_date返回为2016-03-01

如果您希望日期作为特定格式的字符串,请使用

to_char()
,正如您已经尝试过的:

SELECT to_char(submission_date, 'yyyy-mm-dd') 
FROM submissions

正如你所说,结果是 2016-03-01。您还可以更改客户端的 NLS 设置以默认提供该格式,但最好在除即席查询之外的任何内容中明确显示。

如果你这样做:

SELECT to_date(submission_date, 'yyyy-mm-dd') 
FROM submissions

您正在使用不同的功能。

to_date()
to_char()
相反 - 它将字符串转换为日期。

但是...

submission_date
已经是约会了。这意味着使用 NLS 设置将日期隐式转换为字符串,然后将该字符串转换回日期。如此有效,那就是:

SELECT to_date(to_char(submission_date), 'yyyy-mm-dd') 
FROM submissions

您的 NLS 设置是:

SELECT to_date(to_char(submission_date, 'DD-MON-RR'), 'yyyy-mm-dd') 
FROM submissions

结果将于 2016 年 3 月 1 日公布。

您的设置实际上应该给您

16-MAR-01
,而不是
01-MAR-16
。那就是
0001-03-01
。 (隐式)转换
to_char(submission_date, 'DD-MON-RR')
为您提供字符串
'01-MAR-16'
,(显式)转换
to_date('01-MAR-16', 'YYYY-MM-DD')
将 01 转换为年份 - 0001 - 将日期转换为 16。

您的客户端将再次使用您的 NLS 设置显示结果日期

为什么相同的日期格式会得到不同的结果?

您正在使用不同的函数、调用隐式转换并依赖 NLS 设置。

© www.soinside.com 2019 - 2024. All rights reserved.