【发布时间】:2021-03-31 02:33:38
【问题描述】:
我正在尝试从表格列中获取最低日期和最高日期。我正在使用下面的 SQL 查询。
select MIN(trunc(TO_DATE(MOD_BEGIN, 'YYYYMMDDHH24MISS'))) AS MIN_DATUM
, MAX(trunc(TO_DATE(MOD_END, 'YYYYMMDDHH24MISS'))) AS MAX_DATUM
from V_IPSL_PPE_MUC_AZEIT;
仅供参考 - 我在 PL/SQL 中使用此查询。根据上述查询的输出,我将生成日期范围。我们正在使用 oracle 19c。
但问题是这些列MOD_BEGIN、MOD_END 的无效值很少(例如:00000001000000),因此当我执行上述查询时,我收到错误消息:
ORA-01843: 月份无效
ORA-02063: L_IPSL_PPE_MUC 的前一行
我们不允许清理这些无效数据。
如何处理这种情况?
【问题讨论】:
-
看来 MOD_BEGIN 和 MOD_END 不是 DATE 而是 VARCHAR2?如果是这样,那是一个非常严重的设计缺陷。为什么不允许清理明显不正确的数据?这听起来像是一个严重的管理缺陷。另一方面,如果这些列被定义为 DATE,那么您不应该使用 TO_DATE,它使用字符串作为输入。在 DATE 列上使用它会在调用 TO_DATE 之前强制使用隐含的 TO_CHAR。
-
由于字符串的格式为“YYYYMMDDHH24MISS”,因此您只需应用
MIN(mod_begin)和MAX(mod_end)。如果结果看起来像00000001000000,告诉他们您的查询是正确的,他们将修复数据。 EdStevens 当然是正确的。如果有人设计了一个带有日期字符串的数据库,他们必须准备好承受后果。真正的解决方案是修复不恰当的表格设计。
标签: sql oracle datetime aggregate-functions oracle19c