我怎么能从双重运行这个选择to_char(' 01-jan-2016',dd ddspth月yyyy);为什么to_date函数不给我们的欲望格式输出?

时间:2016-05-28 18:46:21

标签: sql database oracle oracle11g oracle10g

为什么此查询无法在oracle select to_date('01-jan-2016',day dd ddspth month yyyy) from dual;上运行?为什么日期功能不能输出我们想要的格式?

为什么to_char函数不能在运行时运行?为什么它只能在sysdateelse等任何属性中运行?

我知道select to_char(to_date('01-jan-2016',day-month-yyyy) from dual;是在oracle上运行的,但是我想在运行时只运行它而没有像select to_char('01-jan-2016',day-month-yyyy) from dual;那样的任何特定属性。同样的情况适用于to_date函数。

2 个答案:

答案 0 :(得分:1)

  

为什么此查询无法在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'之间没有任何关联。不是Oracle的错(或者论坛上的任何人的错误),所以你可以更好地提问。

您的格式为dd(日,两位数),然后是短划线(-),然后是英文的月份简称,所有小写字母,然后是短划线({{1} }),然后是一年(四位数)。正确的掩码是-试试这个:

'dd-mon-yyyy'

关于这一点的几件事。首先,此解决方案假定您的会话日期语言是英语或美国语等;如果是意大利语或中文,select to_date('01-jan-2016', 'dd-mon-yyyy') from dual; 将不被视为有效月份名称(简称)。如果实际上您收到错误消息Ora-01843,"而不是有效的月份",请首先检查以确保jan拼写正确,然后检查您的NLS_DATE_LANGUAGE参数。

其次,你询问"日期功能"给出"输出到我们想要的格式。"请详细了解日期和字符串之间的区别。日期没有格式。字符串。以编写查询的方式调用jan将显示日期,而不是字符串。它会根据您的NLS_DATE_FORMAT参数显示给您。您可以使用to_date()

检查此处提到的NLS参数

如果您想以select * from nls_session_parameters;格式输入日期,并且希望结果是另一个字符串,显示相同的日期但格式不同,则必须先将字符串'01-jan-2016'翻译为约会 - 我告诉你如何做到这一点。然后,你必须把它放在'01-jan-2016'的调用中,它将获取日期并以字符串形式呈现,以你想要的任何(其他)格式。像这样:

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之间的多个空格。格式模型' day'创建一个长度等于英文中最长的星期几名称的字符串。这将是9周三的长度。较短的名称将填充到右侧,空格为最大长度。还要注意星期五和一月的名字,都是小写的;如果你想要大写的首字母(按惯例用英语),你应该在格式掩码中使用日和月而不是日和月。

最后,您的查询还有另一个错误。格式掩码必须是一个字符串(用单引号括起来)。你没有这样做,所以你会得到一条错误信息,即使其他一切都是正确的。

我不理解你的第二和第三段(这很可能意味着它们是荒谬的,因为我的英语非常好);如果你改写它们以便它们有意义,你仍然可以让志愿者愿意帮助你,特别是如果你表现出更多的尊重。祝你好运!

答案 1 :(得分:0)

输出格式是一个字符串,所以它需要引号,所以你试试:

select to_char('01-jan-2016', 'day dd ddspth month yyyy')
from dual;

或者我更喜欢:

select to_char(date '2016-01-01', 'day dd ddspth month yyyy')
from dual;

正确的功能是to_char(),而不是to_date()