Sql Oracle日期值在字符串聚合函数期间更改
当我运行下面两条语句时,得到的输出是Sql Oracle日期值在字符串聚合函数期间更改,sql,oracle,oracle11g,oracle12c,listagg,Sql,Oracle,Oracle11g,Oracle12c,Listagg,当我运行下面两条语句时,得到的输出是 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 现在-如果我尝试在不使用listagg函数更改值的情况下连接上述两个值,则输出会发生如下更改 SELECT listagg
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
现在-如果我尝试在不使用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
请帮助我解决此问题您有隐式转换 Listag接受字符输入。因此,数据库在日期值周围有一个隐式的to_字符。通过更改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
你有隐式转换 Listag接受字符输入。因此,数据库在日期值周围有一个隐式的to_字符。通过更改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
在你的评论中,只需使用注释中所说的
来描述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
)
在你的评论中,只需使用注释中所说的
来描述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
)
使用
TO_CHAR()
,而不是TO_DATE()
。在我的实际场景中,date_a是一个数据类型为date的DB列。为什么要对已经是日期的值执行TO_date()
?我知道这只是一个示例,但为什么要使用带有四个字符掩码(YYYY)的两位年份值(99)?或者根本没有,或者其他问题……使用到CHAR()
,而不是到日期()
。我提供了上述查询作为示例。在我的实际场景中,date_a是一个数据类型为date的DB列。为什么要对已经是日期的值执行TO_date()
?我知道这只是一个示例,但为什么要使用带有四个字符掩码(YYYY)的两位年份值(99)?或者根本没有,或者那件事。。。