【问题标题】:how can i run this select to_char('01-jan-2016',day dd ddspth month yyyy) from dual; why to_date function not give output to our desire format?我如何从 dual 运行这个 select to_char('01-jan-2016',day dd ddspth month yyyy);为什么 to_date 函数不给我们想要的格式输出?
【发布时间】:2016-05-28 18:46:20
【问题描述】:

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

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

我知道 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 函数的情况相同。

【问题讨论】:

  • 不要玩 gordon linoff 的恶作剧 select to_date(date '2016-01-01', 'day dd ddspth month yyyy') from dual;

标签: sql database oracle oracle11g oracle10g


【解决方案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' 之间没有任何联系。不是甲骨文的错(或者这个论坛上任何人的错),所以你可以问得更好。

您的格式是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。

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

我不明白你的第二和第三段(这很可能意味着它们是无意义的,因为我的英语很好);如果你重写它们使它们有意义,你可能仍然会得到愿意帮助你的志愿者,特别是如果你表现出更多的尊重。祝你好运!

【讨论】:

    【解决方案2】:

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

    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()。

    【讨论】:

    • 开个玩笑 gordon linoff select to_date(date '2016-01-01', 'day dd ddspth month yyyy') from dual;不要跑多难过
    • @rajpootrana:请解释为什么你认为这个答案是个玩笑。
    • 因为它不在 oracle 上执行
    • @gordonlinoff - 不要认为to_char 可以处理字符串?? (回复:您的第一个解决方案。)您可能打算将'01-jan-2016' 包装在to_date 中。这将有助于在发布之前测试您的解决方案,因为这不是您第一次发布有语法错误的解决方案。论坛上声誉最高的成员之一不好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多