sql - 在字符串聚合函数期间更改 Oracle 日期值
问题描述
当我运行以下 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
请帮我解决这个问题
解决方案
你有隐式转换!
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
推荐阅读
- c# - 应用程序之间共享的身份 - 身份框架 C#.NET
- linux - Tiltbrush Poly 无法在 Linux 中工作
- docker - 如何在远程 Windows 引擎上运行 Docker 命令
- dynamics-crm - Dynamics 365 中视图的动态参数
- java - java.lang.RuntimeException:失败:HTTP 错误代码:400
- google-cloud-platform - 将 csv 从云存储导入云 sql 时服务帐户的访问被拒绝(权限问题?)
- node.js - 有没有办法在 Node 中跟踪一个实例而不到处传递它?
- branch.io - 您可以在 branch.io 链接的后备 URL 中添加变量吗?
- excel - 将多个电子表格导入 1 - Excel VBA
- django - 如何在 Apache 站点配置中为 Django 指定环境变量?