我正在使用下面的插入语句在表
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
。
为什么相同的日期格式会得到不同的结果?
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 设置。