使用 oracle apex 动态操作设置串联的日期时间值

Using oracle apex dynamic action to set a date time value that is concatenated

我在一个页面项目中有一个日期值,在另一个页面项目中有一个时间值。我想将日期与时间连接起来,并使用动态操作将其设置为另一个项目。结构如下

P_DATE = '01-01-2021'(项目是格式掩码为 dd-mm-yyyy 的日期)

P_TIME = '08:30 AM'(项目是带有格式掩码 HH:MIAM 的日期)

查询:

select to_date(to_char(to_date(P_DATE ,'DD-MON-YYYY'), 'DD-MON-YYYY') || ' '|| 
to_char(P_TIME,'HH:MIAM'),'DD-MON-YYYY HH:MIAM') a
from dual;

期望的结果:01-01-2021 08:30 AM

动态操作正在更改 P_DATE 项,然后从 sql 查询中,连接 P_DATE 和 P_TIME 并将其设置为 P_VALUE

当我 运行 select 在 sql 开发人员中使用硬编码值时,它 returns 是正确的东西但是当我尝试在项目中设置值时concat 日期有时会给我无效的数字错误,而不是有效的月份。

你能建议更正的方法或替代方法吗(也许使用函数)

谢谢。

你可以让它更简单,例如

with test as (
       select '01-01-2021' d, '08:30 PM' t 
       from dual)
select to_date(d||' '|| t,'MM-DD-YYYY HH:MI PM') 
from test;

来自评论:

the page items are both date items

因为它们是日期,您可以简单地使用:

SELECT p_date + (p_time - TRUNC(p_time)) AS a
FROM   DUAL;

“它们是日期项目”是什么意思?它们是“日期选择器”类型,它们是否在表单中具有“DATE”类型的源列,或者它们是否映射到数据库中的 DATE 列?

在APEX中,所有页面项基本上都是字符串。 Web 应用程序的前端不知道 oracle 数据类型,因此所有内容都被视为纯字符串,并在处理过程中完成转换。这就是您应该如何处理页面项目,而不是像在 SQL 或 PL/SQL 中那样处理 DATE 数据类型。要连接日期字符串和时间字符串,您可以直接连接而不使用 TO_CHAR。这可以在普通 PL/SQL 中完成,不需要 SELECT FROM DUAL - 这只是对 SQL 引擎的不必要调用。

这是对 P_VALUE 更改的“真实”操作。在 21.1 上测试,因此根据您的版本可能会有一些属性命名差异,但它的工作原理是一样的。

动作:执行服务器端代码。
来源:

:P_VALUE := :P_DATE ||' '||:P_TIME

要提交的项目:P_DATE、P_TIME。
return 的项目:P_VALUE

由于您处理的是字符串,所以这里存在出错的空间,如果用户输入的格式与格式不完全匹配,您必须确保正确的错误处理,因为这可能会生成无效的日期值。