为什么这个查询不能在 oracle select to_date('01-jan-2016',day dd
ddspth month yyyy) from dual; 上运行?为什么日期函数不输出
我们想要的格式?
查询将不会运行,因为您违反了正确的语法。查看 Oracle 文档几乎与在此处发布问题一样容易。 to_date 接受一个字符串参数,你做得很好。 '01-jan-2016' 很好。第二个参数应该准确地告诉编译器该字符串使用了什么格式。您的字符串是'01-jan-2016',但您提供了格式模型'day dd ddspth month yyyy' - 这与'01-jan-2016' 之间没有任何联系。不是甲骨文的错(或者这个论坛上任何人的错),所以你可以问得更好。
您的格式是dd(日,两位数),然后是破折号(-),然后是英文月份名称的缩写形式,全部小写字母,然后是破折号(-),然后是年份(四位数)。正确的掩码是'dd-mon-yyyy' 试试这个:
select to_date('01-jan-2016', 'dd-mon-yyyy') from dual;
关于这个的一些事情。首先,此解决方案假定您的会话日期语言是英语或美国等;如果是意大利语或中文,jan 将不会被识别为有效的月份名称(简称)。如果实际上您收到错误消息 Ora-01843,“not a valid month”,请首先检查以确保 jan 拼写正确,然后检查您的 NLS_DATE_LANGUAGE 参数。
其次,您询问“日期函数”是否提供“输出为我们所需的格式”。请详细了解日期和字符串之间的区别。日期没有格式。字符串可以。以您编写查询的方式调用to_date() 将向您显示日期,而不是字符串。它将根据您的 NLS_DATE_FORMAT 参数显示给您。您可以使用select * from nls_session_parameters;检查此处提到的两个 NLS 参数
如果您想输入格式为'01-jan-2016' 的日期,并且您希望结果是另一个字符串,显示相同的日期但格式不同,您必须首先将字符串'01-jan-2016' 转换为日期 - I向您展示了如何在上面执行此操作。然后,您必须将其放入对to_char() 的调用中,它将获取日期并将其以字符串形式呈现,以您想要的任何(其他)格式。像这样:
select to_char(to_date('01-jan-2016', 'dd-mon-yyyy'), 'day dd ddspth month yyyy')
from dual;
结果如下所示(注意列名 - 如果您在 select 语句中不使用别名,您将得到类似的垃圾名称):
TO_CHAR(TO_DATE('01-JAN-2016','DD
---------------------------------
friday 01 first january 2016
注意friday 和01 之间的许多空格。格式模型 'day' 创建一个长度等于英文中最长的星期几名称的字符串。那将是 9,即星期三的长度。较短的名称用空格填充到最大长度的右侧。还要注意 friday 和 january 的名称,都是小写的;如果你想要大写的首字母(按照英语的习惯),你应该在格式掩码中使用 Day 和 Month 而不是 day 和 month。
最后,您的查询还有一个错误。格式掩码必须是字符串(用单引号括起来)。你没有这样做,所以即使其他一切都是正确的,你也会收到一条错误消息。
我不明白你的第二和第三段(这很可能意味着它们是无意义的,因为我的英语很好);如果你重写它们使它们有意义,你可能仍然会得到愿意帮助你的志愿者,特别是如果你表现出更多的尊重。祝你好运!