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

How to get lowest and highest date from a table column?

我正在尝试从 table 列中获取最低日期和最高日期。我正在使用下面的 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: not a valid month
ORA-02063: preceding line from L_IPSL_PPE_MUC

不允许我们清理这些无效数据。

如何处理这种情况?

如果您是 运行 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() returns null 而不是报错;然后周围的聚合函数忽略 null 值。

另一个解决方案可以使用自定义转换函数,在转换错误的情况下将 return 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;