在Oracle

时间:2016-07-23 19:54:27

标签: oracle

我已插入Oracle的表中。我没有PLSQL的实现是:

SELECT to_date('1900-01-01','YYYY-MM-DD') + (rownum - 1) AS DT_CAL, 
       rownum AS NUM_JOUR 
FROM   dual 
CONNECT BY to_date('1900-01-01','YYYY-MM-DD') + (rownum - 1) <= 
                                                      to_date('2000-12-31','YYYY-MM-DD')

结果是:05/28/1900,而不是1900-05-28。你能帮我理解问题是什么吗?

2 个答案:

答案 0 :(得分:1)

to_date()接受您的字符串参数,将其与您在第二个参数中提供的格式相匹配,并从中构造日期字段。日期字段不是使用您在第二个参数中提供的格式 - 实际上它将使用一些完全没有格式的内部数据表示来存储(很可能是一个数字)。

要在日期字段的结果中显示格式,您可以:

  1. 让执行查询的客户端设置NLS参数(在会话级别)以提供本地化格式,并使用ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';语句)或
  2. 在现有字段周围使用to_char(..., 'YYYY-MM-DD')将日期重新转换为以您希望的方式格式化的字符串。使用select中的当前列定义替换...的位置。
  3. 方法#1已经发生,因为已经有NLS_DATE_FORMAT设置生成当前格式,但它有一个你不想要的格式,所以如果你能控制它并在那里改变它,你可以这样做。如果你不能和你必须采用一致的其他方式,那么#2就可以了。

答案 1 :(得分:1)

DATE数据类型没有格式; Oracle将其存储为7- or 8-bytes,直到将其传递给客户端程序(即SQL / Plus,SQL Developer,Toad,Java,Python等),并且客户端程序根据任何规则对其进行格式化是的,日期有格式。

如果您使用的是SQL / Plus或SQL Developer,那么它将使用NLS_DATE_FORMAT会话参数来格式化日期。 You can change this使用:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

(请注意,这只会更改当前会话中的格式,并且不会为任何其他会话/用户更改格式。)

如果您想以特定格式指定日期,则需要convert it to a string