如何从 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_BEGIN
、MOD_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;
我正在尝试从 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_BEGIN
、MOD_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;