const ISO_ORDER_YEAR_SQL = "substring(data_pedido from '^(\\d{4})[-/]')::int"; const ISO_ORDER_MONTH_SQL = "substring(data_pedido from '^\\d{4}[-/](\\d{1,2})[-/]')::int"; const ISO_ORDER_DAY_SQL = "substring(data_pedido from '^\\d{4}[-/]\\d{1,2}[-/](\\d{1,2})')::int"; const BR_ORDER_DAY_SQL = "substring(data_pedido from '^(\\d{1,2})[-/]')::int"; const BR_ORDER_MONTH_SQL = "substring(data_pedido from '^\\d{1,2}[-/](\\d{1,2})[-/]')::int"; const BR_ORDER_YEAR_SQL = "substring(data_pedido from '^\\d{1,2}[-/]\\d{1,2}[-/](\\d{4})')::int"; const buildSafeDateSql = ({ yearSql, monthSql, daySql }) => { const candidateDateSql = `(make_date(${yearSql}, ${monthSql}, 1) + ((${daySql} - 1) * INTERVAL '1 day'))::date`; return ` CASE WHEN ${yearSql} BETWEEN 1 AND 9999 AND ${monthSql} BETWEEN 1 AND 12 AND ${daySql} BETWEEN 1 AND 31 AND EXTRACT(MONTH FROM ${candidateDateSql})::int = ${monthSql} THEN ${candidateDateSql} ELSE NULL END `; }; const ORDER_DATE_SQL = ` COALESCE( data_pedido_date, CASE WHEN data_pedido ~ '^\\d{4}[-/]\\d{1,2}[-/]\\d{1,2}' THEN ${buildSafeDateSql({ yearSql: ISO_ORDER_YEAR_SQL, monthSql: ISO_ORDER_MONTH_SQL, daySql: ISO_ORDER_DAY_SQL })} WHEN data_pedido ~ '^\\d{1,2}[-/]\\d{1,2}[-/]\\d{4}' THEN ${buildSafeDateSql({ yearSql: BR_ORDER_YEAR_SQL, monthSql: BR_ORDER_MONTH_SQL, daySql: BR_ORDER_DAY_SQL })} ELSE NULL END ) `; module.exports = { ORDER_DATE_SQL };