我已插入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。 您能帮我了解问题出在哪里吗?
DATE数据类型没有格式。 Oracle将其存储为7字节或8字节,直到将其传递给客户端程序(即SQL / Plus,SQL Developer,Toad,Java,Python等),并且客户端程序才根据任何规则对其进行格式化它具有日期获取格式。
如果您使用的是SQL / Plus或SQL Developer,则它将使用NLS_DATE_FORMAT会话参数来格式化日期。您可以使用以下方法更改此设置:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
(请注意,这只会更改当前会话中的格式,而不会更改任何其他会话/用户的格式。)
如果要给日期指定特定格式,则需要将其转换为字符串。
当我使用to_char(2006-01-01,YYYY-MM-DD)时出现此错误:
ORA-00932:数据类型不一致:预期DATE得到NUMBER
2006-01-01是字符串文字,而不是日期。 DATE 2006-01-01是日期文字。
to_date()接受您的字符串参数,使其与您在第二个参数中提供的格式匹配,并从中构造一个日期字段。 date字段未使用您在第二个参数中提供的格式-实际上,它将使用某种内部数据表示形式存储该数据,而这些表示形式根本没有格式(很可能是一个数字)。
要在日期字段的结果中显示格式,您可以:
让执行查询的客户端设置NLS参数(在会话级别)以提供本地化格式(带有ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';语句),或者
在现有字段周围使用to_char(..., 'YYYY-MM-DD')将日期改回为您想要的日期格式的字符串。在选择中将...替换为当前列定义的位置。
方法1已经在发生,因为已经有一个NLS_DATE_FORMAT集正在生成当前格式,但是它具有您不需要的格式,因此,如果您可以控制它并在其中进行更改,则可以这样做办法。如果您不能这样做,并且必须以另一种一致的方式设置格式,则可以选择#2。
这是正确的答案。对于"生产"查询,始终最好将to_char(DATE_COLUMN,.....)与所需的日期格式模型配合使用,因为我们无法控制其他用户的NLS设置;但是对于OP来说,仅检查自己的结果,NLS_DATE_FORMAT解决方案就足够了。关于Oracle用于内部存储日期的内部格式的注释:OTN上的" BluShadow"有一个很好的解释。要自己寻找,可以运行SELECT DUMP(SYSDATE)FROM DUAL并尝试理解它。它不明显-但它不是数字,而是七个数字。
@mathguy日期格式也可以在Stackoverflow文档中找到。
@ MT0太好了,谢谢!我看到了SO文档的广告,但还没有去研究它。好主意,可能很快就会加入。