Oracle PL / SQL:不考虑to_date()格式

时间:2017-03-29 09:11:31

标签: sql oracle date plsql format

当我在PL / SQL Developer中执行它时:

SELECT to_date('29/03/17 14:05','DD/MM/RR HH24:MI')  FROM dual;

这是我得到的:

3/29/2017 2:05:00 PM

这怎么可能?我使用的是HH24,但似乎正在使用它HH。日期和月份也不是我输入的格式。

3 个答案:

答案 0 :(得分:2)

使用to_date方法执行的操作是将字符串解析为日期对象。如果您希望将日期对象输出为具有不同格式的字符串,则应使用to_char方法。

示例:

SELECT to_char(
    to_date('29/03/17 14:05','DD/MM/RR HH24:MI'), 
    'DD/MM/RR HH24:MI'
) FROM dual;

答案 1 :(得分:2)

好的,概念性的练习即将来临

这些日期中的哪一个代表2017年1月1日?

01/01/2017
2017-01-01
01-JAN-2017

是的,所有人都是对的。 date数据类型不是格式,它存储日期的值,而不是它的显示方式。

如果使用Oracle,请调整您的NLS_DATE_FORMAT以符合您的期望,但同样,这只是系统显示日期的方式,而不是它如何存储日期。

答案 2 :(得分:1)

(N.B。这个答案更多是为了让其他答案更加清晰,但评论的时间太长了。)

Oracle以自己的特定格式存储DATE(和TIMESTAMP等)。我们人类以各种不同的格式表示日期,我们处理字符串。在没有上下文的情况下,即使我们人类也会对日期字符串代表的内容感到困惑03/09/2017 - 是2017年9月3日还是2017年3月9日?

因此,当您将日期传递给Oracle时,您需要通过传入一个字符串并告诉Oracle该字符串的日期格式是什么来将其转换为Oracle的日期格式。这可以使用to_date()DATE文字(始终为yyyy-mm-dd格式)来完成。

相反,当您想要阅读存储在Oracle的DATE数据类型中的内容时,您需要告诉Oracle您希望如何显示它,您可以使用to_char()来执行此操作使用适当的格式掩码。

如果您无法显式转换字符串到日期或日期到字符串,则Oracle使用NLS_DATE_FORMAT中指定的格式来决定如何进行转换。

在您的情况下,您没有指定希望如何显示日期,因此Oracle必须使用to_char()以及NLS_DATE_FORMAT中包含的格式才能将日期显示为字符串,并且显然与您在as。中传递日期字符串的格式不同。