如何从表格列中获取最低和最高日期?

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_BEGINMOD_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:字符串中的前一行。

以上是关于如何从表格列中获取最低和最高日期?的主要内容,如果未能解决你的问题,请参考以下文章

从 2 个 REF 列中获取两个日期之间的差异

如何根据日期列中的月份从 SQLite 中获取数据

当我输入单元格时自动获取日期和时间,但在谷歌表格的单独列中

如何仅从日期时间列中获取日期? [复制]

如何在另一列中按条件分组的列中查找下一个日期?

SQL 查询为其他列中的每个唯一条目返回最高和最低