Значение даты Oracle изменяется во время агрегирования строковых функций - PullRequest
0 голосов
/ 25 сентября 2018

Когда я запускаю приведенные ниже 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, вывод будет изменен следующим образом:this.

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

Пожалуйста, помогите мне решить эту проблему

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018
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)
0 голосов
/ 25 сентября 2018

У вас просто используйте 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
    )
0 голосов
/ 25 сентября 2018

У вас есть неявные преобразования!

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 

Избегайте этого, явно указав даты:

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   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...