【问题标题】:Oracle Date Value is changed during String aggregate Functions在字符串聚合函数期间更改 Oracle 日期值
【发布时间】:2019-03-01 02:32:03
【问题描述】:

当我运行以下 2 个语句时,我得到的输出是

SELECT TO_DATE ('01/01/99', 'MM/DD/YYYY') AS date_a FROM DUAL
UNION ALL
SELECT TO_DATE ('01/01/99', 'MM/DD/YYYY') AS date_a FROM DUAL
Output
---------
1/1/0099
1/1/0099

现在 - 如果我尝试连接上述 2 个值而不使用 listagg 函数更改值,则输出将像这样更改。

SELECT listagg(date_a,'#') WITHIN GROUP(order by date_a)  FROM 
(
SELECT TO_DATE ('01/01/99', 'MM/DD/YYYY') AS date_a FROM DUAL
UNION ALL
SELECT TO_DATE ('01/01/99', 'MM/DD/YYYY') AS date_a FROM DUAL
)
Output
--------
01-JAN-99#01-JAN-99

我需要输出为1/1/00999#1/1/00999

请帮我解决这个问题

【问题讨论】:

  • 使用TO_CHAR(),而不是TO_DATE()
  • 我提供了上述查询作为示例。在我的实际场景中,date_a 是一个数据类型为 Date 的 DB 列。
  • 为什么要对已经是 DATE 的值执行 TO_DATE()
  • 我知道这只是一个例子,但你为什么要使用带有四字符掩码 (YYYY) 的两位数年份值 (99)?或者根本,或者那件事......

标签: sql oracle oracle11g oracle12c listagg


【解决方案1】:

在你的只是使用评论中说的to_char()

SELECT listagg(date_a,'#') WITHIN GROUP(order by date_a)  FROM 
    (
    SELECT to_char( TO_date ('01/01/0099', 'MM/DD/YYYY'),'MM/DD/YYYY') AS date_a FROM DUAL
    UNION ALL
    SELECT to_char(TO_date ('01/01/0099', 'MM/DD/YYYY'),'MM/DD/YYYY') AS date_a FROM DUAL
    )

【讨论】:

    【解决方案2】:
    SELECT LISTAGG (TO_CHAR (date_a, 'MM/DD/YYYY'), '#') WITHIN GROUP (ORDER BY date_a)
      FROM (SELECT TO_DATE ('01/01/99', 'MM/DD/YYYY') AS date_a FROM DUAL
            UNION ALL
            SELECT TO_DATE ('01/01/99', 'MM/DD/YYYY') AS date_a FROM DUAL)
    

    【讨论】:

      【解决方案3】:

      你有隐式转换!

      Listagg 接受字符输入。因此,数据库在您的日期值周围有一个隐含的 to_char。您可以通过更改 nls_date_format 参数看到这一点:

      alter session set nls_date_format = 'dd-mon-yyyy';
      
      select listagg(date_a,'#') within group(order by date_a)  dts
      from 
      (
      select to_date ('01/01/99', 'mm/dd/yyyy') as date_a from dual
      union all
      select to_date ('01/01/99', 'mm/dd/yyyy') as date_a from dual
      );
      
      DTS                       
      01-jan-0099#01-jan-0099  
      
      alter session set nls_date_format = 'yyyy-mm-dd';
      
      select listagg(date_a,'#') within group(order by date_a) dts
      from 
      (
      select to_date ('01/01/99', 'mm/dd/yyyy') as date_a from dual
      union all
      select to_date ('01/01/99', 'mm/dd/yyyy') as date_a from dual
      );
      
      DTS                     
      0099-01-01#0099-01-01 
      

      通过明确地to_charing你的日期来避免这种情况:

      select listagg( to_char ( date_a, 'mm/dd/yyyy' ),'#') within group(order by date_a) dts 
      from 
      (
      select to_date ('01/01/99', 'mm/dd/yyyy') as date_a from dual
      union all
      select to_date ('01/01/99', 'mm/dd/yyyy') as date_a from dual
      );
      
      DTS                     
      01/01/0099#01/01/0099   
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-08
        • 2011-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 2013-11-25
        • 1970-01-01
        相关资源
        最近更新 更多