Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle日期值在字符串聚合函数期间更改_Sql_Oracle_Oracle11g_Oracle12c_Listagg - Fatal编程技术网

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)?或者根本没有,或者那件事。。。