如何从表格列中获取最低和最高日期?
Posted
技术标签:
【中文标题】如何从表格列中获取最低和最高日期?【英文标题】:How to get lowest and highest date from a table column? 【发布时间】: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。 What should I do when someone answers my question? 由于字符串的格式为“YYYYMMDDHH24MISS”,因此您只需应用MIN(mod_begin)
和MAX(mod_end)
。如果结果看起来像00000001000000
,告诉他们您的查询是正确的,他们将修复数据。 EdStevens 当然是正确的。如果有人设计了一个带有日期字符串的数据库,他们必须准备好承受后果。真正的解决方案是修复不恰当的表格设计。
【参考方案1】:
如果您运行的是 Oracle 12.2 或更高版本,这可能是使用ON CONVERSION ERROR
的好地方:
select
trunc(min(to_date(mod_begin default null on conversion error, 'yyyymmddhh24miss'))) as min_datum,
trunc(max(to_date(mod_end default null on conversion error, 'yyyymmddhh24miss'))) as max_datum
from v_ipsl_ppe_muc_azeit;
当遇到无效日期时,to_date()
返回null
而不是报错;然后周围的聚合函数忽略null
值。
【讨论】:
完美!非常感谢。我们在 19c,它有效。 现在对于其中一张表,我得到:ORA-00907:缺少右括号 ORA-02063:L_IPSL_PPE_OXF 00907.00000 的前一行 -“缺少右括号”。当我将表格更改为上述表格时,它就可以正常工作了。【参考方案2】:另一种解决方案是使用自定义转换函数,在转换错误的情况下返回 NULL:
FUNCTION convert_date (p_str IN varchar2, p_format varchar2)
RETURN DATE IS
BEGIN
RETURN TO_DATE(p_str , p_format);
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END convert_date ;
并在你的代码中使用这个函数:
select
trunc(min(convert_date (mod_begin, 'yyyymmddhh24miss'))) as min_datum,
trunc(max(convert_date (mod_end, 'yyyymmddhh24miss'))) as max_datum
from v_ipsl_ppe_muc_azeit;
【讨论】:
这实际上工作得很好,尤其是与 dblinks。在 sql 查询中将default null on conversion error
与数据库链接(视图)一起使用导致我出现错误 ORA-02063:字符串中的前一行。以上是关于如何从表格列中获取最低和最高日期?的主要内容,如果未能解决你的问题,请参考以下文章