与datetime格式有点误解

时间:2016-10-14 22:43:15

标签: oracle datetime-format oracle12c

SELECT TO_TIMESTAMP('2016-10-01 01:00:01', 'YYYY-MM-DD HH24:MI:SS') from dual;

给予:2016-10-01 01:00:01

此处yearmonth部分可供我理解,但Documentation说明了其他格式:

"DD" - Day of month (1-31)

"HH24" - Hour of day (0-23)

"MI" - Minute (0-59)

"SS" - Second (0-59)

那么,为什么例如“DD”格式返回01而不只是:1

例如“MM”格式,在同一文档中描述为:

MM - Month (01-12; January = 01)并且清楚地显示了一切:1月= 01

此外,有点令人困惑的是时间部分(至少对我而言),因为在文档中,所有内容的范围都以0开头,但返回结果为00

我从上面的查询中得到了预期,结果如下:

2016-10-1 1:0:1

我错过了什么并且没有正确理解?

1 个答案:

答案 0 :(得分:1)

首先,您传递两个字符串:要转换为timestamp数据类型的实际日期时间(或时间戳)以及格式模型。然后你调用to_timestamp(),结果是一个时间戳。然后你在屏幕上显示它(通过SQLPlus或SQL Developer或其他)。只有字符串才能显示在屏幕上 - 而不是数字,而不是时间戳等。所以:某处,某种程度上,你的时间戳被转换回字符串。

您可以通过在时间戳周围调用to_char(.....)来明确地执行此操作,或者如果不这样做,则接口应用程序(SQLPlus,SQL Developer,...)将使用会话的NLS_TIMESTAMP_FORMAT参数。在该参数中,您可以强制使用所需的任何格式模型。特别是,您可以使用FM格式模型修饰符来抑制前导零。

在不更改NLS_TIMESTAMP_FORMAT的情况下,您可以在查询中使用to_char()查看相同的效果。试试这个:

select to_char(to_date('01-Feb-12', 'dd-Mon-yy'), 'FMdd/mm/yyyy hh24:mi:ss') from dual;

输出:1/2/2012 0:0:0