【问题标题】:Oracle Date TO_CHAR('Month DD, YYYY') has extra spaces in itOracle Date TO_CHAR('Month DD, YYYY') 中有多余的空格
【发布时间】:2011-11-02 05:54:42
【问题描述】:

当我这样做时……

Select TO_CHAR (date_field, 'Month DD, YYYY')
from...

我得到以下信息:

July      01, 2011
April     01, 2011
January   01, 2011

为什么我的月份和日期之间有多余的空格?为什么不把它们放在一起呢?

【问题讨论】:

  • 我通过 --- TRIM(TO_CHAR (date_field, 'Month')) || 解决了这个问题TO_CHAR (date_field, 'DD, YYYY') || '通过' || TRIM(TO_CHAR(date_field, '月')) || TO_CHAR(日期字段,'DD,YYYY')。但我很好奇甲骨文为什么要这样做。
  • 他们这样做是为了让您的输出在所有月份都保持一致。当然,这是记录在案的行为。您只需要告诉数据库不要填充它(即:请参阅我的答案)

标签: sql oracle oracle10g


【解决方案1】:

为什么我的月份和日期之间有多余的空格?为什么不把它们放在一起呢?

因此您的输出将对齐。

如果您不想填充,请使用格式修饰符 FM:

SELECT TO_CHAR (date_field, 'fmMonth DD, YYYY') 
  FROM ...;

参考:Format Model Modifiers

【讨论】:

  • 在 Postgresql 中为我工作。谢谢兄弟:)
  • 请注意,如果 fm 修饰符仅对月份有效,而不是当天的前导零,则可能需要 to_char(date_field, 'fmMonth') || to_char(date_field, ' DD, YYYY')
  • "所以你的输出会对齐" 嗯....只有当你的字体是等宽字体时。如果您使用“月”格式化程序,它很少是等宽的,因为您很可能会将此输出显示给从未在等宽中工作的最终用户。
【解决方案2】:

如果您在 to_char 中使用 'Month',它会向右填充 9 个字符;您必须使用缩写的“MON”或 to_char 然后修剪并连接它以避免这种情况。看,http://www.techonthenet.com/oracle/functions/to_char.php

select trim(to_char(date_field, 'month')) || ' ' || to_char(date_field,'dd, yyyy')
  from ...

select to_char(date_field,'mon dd, yyyy')
  from ...  

【讨论】:

  • 我想我明白为什么 Oracle 会这样做,但它并不适合所有场景:|
  • @contactmatt,我认为这仅仅是因为九月是 9 个字符,这并不能阻止它变得荒谬。
  • @Ben - 这并不荒谬,它只是从一个时代开始的关于那个行为。 NullUserException 建议使用 'fm' 修饰符是向 Oracle 表明您不想要默认的空白填充行为的正确方法。
  • NullUserException 的回答(如下)是一种更优雅的方式。
  • 我认为这是广为人知的@fasttrainofthoughts...你看到投票总数了吗?这是我很久以前写的,当时我不太了解。不幸的是,我无法删除它,因为 OP 接受了它。很明显你应该使用 Null,所以我认为这并不重要......
【解决方案3】:

你应该使用 fm 元素来删除空格。

SELECT TO_CHAR(sysdate, 'fmDAY DD "de" MONTH "de" YYYY') CURRENT_DATE
FROM   dual;

【讨论】:

    【解决方案4】:
    SQL> -- original . . .
    SQL> select
      2  to_char( sysdate, 'Day "the" Ddth "of" Month, yyyy' ) dt
      3  from dual;
    
    DT
    ----------------------------------------
    Friday    the 13th of May      , 2016
    
    SQL>
    SQL> -- collapse repeated spaces . . .
    SQL> select
      2  regexp_replace(
      3      to_char( sysdate, 'Day "the" Ddth "of" Month, yyyy' ),
      4      '  * *', ' ') datesp
      5  from dual;
    
    DATESP
    ----------------------------------------
    Friday the 13th of May , 2016
    
    SQL>
    SQL> -- and space before commma . . .
    SQL> select
      2  regexp_replace(
      3      to_char( sysdate, 'Day "the" Ddth "of" Month, yyyy' ),
      4      '  *(,*) *', '\1 ') datesp
      5  from dual;
    
    DATESP
    ----------------------------------------
    Friday the 13th of May, 2016
    
    SQL>
    SQL> -- space before punctuation . . .
    SQL> select
      2  regexp_replace(
      3      to_char( sysdate, 'Day "the" Ddth "of" Month, yyyy' ),
      4      '  *([.,/:;]*) *', '\1 ') datesp
      5  from dual;
    
    DATESP
    ----------------------------------------
    Friday the 13th of May, 2016
    

    【讨论】:

      【解决方案5】:

      试试这个:-

      select to_char(to_date('01/10/2017','dd/mm/yyyy'),'fmMonth fmDD,YYYY') from dual;
      
      select to_char(sysdate,'fmMonth fmDD,YYYY') from dual;
      

      【讨论】:

      • 如果你使用:SELECT TO_CHAR (date_field, 'fmMonth DD, YYYY') FROM ...;然后查询将为 01 返回 DD 1,与 2 到 9 相同但是如果您使用 SELECT TO_CHAR (date_field, 'fmMonth fmDD, YYYY') FROM ... 那么它将返回 DD 为 01
      • 请编辑您的答案以包含评论中的信息以提高可读性,谢谢:)
      【解决方案6】:

      select to_char(sysdate, 'DD-fmMONTH-YYYY') 从 Dual 中选择“日期”;

      以上查询结果如下。

      日期

      2019 年 4 月 1 日

      【讨论】:

      • 在上面的查询中,日期结果会保留前导的 0 表示天为 01 并且 APRIL 月份之后没有空格。如果您希望月份以正确的形式拼写,请使用以下格式。从 Dual 中选择 to_char(sysdate, 'DD-fmMonth-YYYY') "Date";然后结果将显示为 '01-April-2019'
      猜你喜欢
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多