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

Oracle PL/SQL:未考虑to_date()格式,sql,oracle,date,plsql,format,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被替代了。日期和月份也不是我输入的格式。使用to_date方法将字符串解析为日期对象。然后,如果希望以不同格式的字符串形式输出日期对象,则应使用to_char方法 例如: SELECT to_char(

在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
被替代了。日期和月份也不是我输入的格式。

使用
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;

使用
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;

好的,接下来是概念练习

以下哪个日期代表2017年1月1日

01/01/2017
2017-01-01
01-JAN-2017
是的,他们都是。日期数据类型不是一种格式,它存储日期的值,而不是日期的显示方式


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

好的,接下来是概念练习

以下哪个日期代表2017年1月1日

01/01/2017
2017-01-01
01-JAN-2017
是的,他们都是。日期数据类型不是一种格式,它存储日期的值,而不是日期的显示方式

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

(注意,这个答案更能让其他答案更清晰,但对于注释来说太长了。)

Oracle以自己的特定格式存储日期(和时间戳等)。我们人类用各种不同的格式表示日期,我们处理字符串。即使是美国人也会对日期字符串表示什么感到困惑,因为没有上下文-例如2017年9月3日是2017年9月3日还是2017年3月9日

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

相反,当您想要读取存储在Oracle日期数据类型中的内容时,您需要告诉Oracle您希望如何显示它,这可以通过使用带有适当格式掩码的
to_char()
来实现

如果无法显式地将字符串转换为日期或日期转换为字符串,则Oracle将使用NLS_date_格式中指定的格式来决定如何进行转换

在您的情况下,您没有指定日期的显示方式,因此Oracle必须使用
to_char()
以及NLS_date_格式中包含的格式,以便将日期显示为字符串,这显然与您在as中传递日期字符串的格式不同。

(注意:这个答案更能让其他答案更清晰,但它太长,无法发表评论。)

Oracle以其自己的特定格式存储日期(和时间戳等)。美国人以各种不同的格式表示日期,我们处理字符串。即使是美国人也会对日期字符串表示的内容感到困惑,因为没有上下文-例如2017年9月3日
2017年9月3日
-是2017年9月3日还是2017年3月9日

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

相反,当您想要读取存储在Oracle日期数据类型中的内容时,您需要告诉Oracle您希望如何显示它,这可以通过使用带有适当格式掩码的
to_char()
来实现

如果无法显式地将字符串转换为日期或日期转换为字符串,则Oracle将使用NLS_date_格式中指定的格式来决定如何进行转换


在您的例子中,您没有指定日期的显示方式,因此Oracle必须使用
to_char()
以及NLS\u DATE\u格式中包含的格式,以便将日期显示为字符串,这显然与您在as中传递日期字符串的格式不同。

您有
pm
那么goodDates在存储时并没有真正的格式,只有在显示时才有。这更多是关于显示设置,或者您的NLS\u DATE\uMAT,撇开其他任何东西不谈,为什么你仍然使用两位数的年份?年份有四位数!为什么要让数据库猜测你的意思是2017年、1917年甚至2117年?你有
pm
,那么goodDates在存储时并没有真正的格式,只有在显示时才有。这更多的是关于显示设置,或者你的NLS_DATE_格式,比其他任何格式都重要,为什么你仍然使用两位数的年份?年份有四位数!为什么要让数据库猜测你是指2017年还是1917年,甚至2117年,如果你可以明确的话?!