#sql #postgresql
Вопрос:
Я написал следующий запрос, который отлично работает во время работы в Excel. Но в нем говорится, что всякий раз, когда я пытаюсь запустить его на pgAdmin, возникает синтаксическая ошибка. В нем говорится, что он расположен после утверждения «ГДЕ», где говорится
WHERE
EXTRACT(YEAR FROM DATE(horasolicitud)) = ?
AND EXTRACT(MONTH FROM DATE(horasolicitud)) = ?
Полный запрос таков:
--Consulta del Mes
SELECT
OT.id AS id_ot,
OT.numero AS numero_orden,
OT.idautoridad,
AU.nombre AS nombre_autoridad,
OT.idcarretera,
CR.nombre AS nombre_carretera,
OT.idcliente,
CT.idtipodecliente,
CT.nombre AS nombre_cliente,
CT.numero AS numero_cliente,
OT.idprimeroperador AS idoperador,
OP.nombre AS nombre_operador,
OP.numero AS numero_operador,
OT.idprimerunidad AS idunidad,
UN.modelo AS modelo,
UN.numero AS numero_grua,
UN.placas,
UN.idtipodeunidad,
OT.idsucursal,
SC.nombre AS nombre_sucursal,
OT.idtipodeservicio,
CASE
WHEN OT.idtipodeservicio IN (1,2,3,4,6) THEN 'Remolque'
WHEN OT.idtipodeservicio IN (5) THEN 'Auxilio Vial'
ELSE 'Otro'
END AS TipoServicio,
OT.idusuario,
OT.idvehiculo,
OT.estatus,
OT.horainicio AS fechahora_inicio,
OT.horasalida AS fechahora_salida,
OT.horasolicitud AS fechahora_solicitud,
OT.fechaprogramada AS fecha_programada,
CASE
WHEN DATE(OT.horainicio) < DATE(OT.horasolicitud) THEN '0'
ELSE OT.horainicio - OT.horasolicitud
END AS tiempo_contacto,
CASE WHEN EXTRACT(DAY FROM DATE(OT.fechaprogramada)) > 0 THEN '0' ELSE
(EXTRACT(HOUR FROM (CASE
WHEN DATE(OT.horainicio) < DATE(OT.horasolicitud) THEN '0'
ELSE OT.horainicio - OT.horasolicitud
END)) * 60
EXTRACT(MINUTE FROM (CASE
WHEN DATE(OT.horainicio) < DATE(OT.horasolicitud) THEN '0'
ELSE OT.horainicio - OT.horasolicitud
END))) END AS minutos_contacto,
CASE WHEN EXTRACT(DAY FROM DATE(OT.fechaprogramada)) > 0 THEN '0' ELSE
(EXTRACT(HOUR FROM (CASE
WHEN DATE(OT.horasalida) < DATE(OT.horasolicitud) THEN '0'
ELSE OT.horasalida - OT.horasolicitud
END)) * 60
EXTRACT(MINUTE FROM (CASE
WHEN DATE(OT.horasalida) < DATE(OT.horasolicitud) THEN '0'
ELSE OT.horasalida - OT.horasolicitud
END))) END AS minutos_asignacion,
DATE(ot.horasolicitud) AS fecha_solicitud,
EXTRACT(YEAR FROM DATE(ot.horasolicitud)) AS anio_solicitud,
EXTRACT(MONTH FROM DATE(ot.horasolicitud)) AS mes_solicitud,
EXTRACT(HOUR FROM (ot.horasolicitud)) AS hora_solicitud,
CASE
WHEN EXTRACT(HOUR FROM (ot.horasolicitud)) > 6
AND EXTRACT(HOUR FROM (ot.horasolicitud)) < 19 THEN 'dia'
ELSE 'noche'
END AS dia_noche,
OT.horatermino AS fechahora_termino,
OT.minutosdecontacto AS minutos_contacto_stma,
OT.iddivision,
DV.nombre AS nombre_division,
OT.ccachesubtotal AS importe_total,
OT.cimportetrafico AS importe_trafico,
OT.longddorigen AS longitud,
OT.latddorigen AS latitud,
OT.cachekminicio AS km_inicio,
OT.cachekmfin AS km_fin,
CASE
WHEN OT.cachekminicio = 0 THEN '0'
ELSE OT.cachekmfin - OT.cachekminicio
END AS km_recorr
FROM OT
LEFT JOIN autoridad AU ON OT.idautoridad = AU.idautoridad
LEFT JOIN carretera CR ON OT.idcarretera = CR.idcarretera
LEFT JOIN cliente CT ON OT.idcliente = CT.id
JOIN operador OP ON OT.idprimeroperador = OP.id
JOIN unidad UN ON OT.idprimerunidad = UN.id
JOIN sucursal SC ON OT.idsucursal = SC.idsucursal
JOIN division DV ON ot.iddivision = DV.id
WHERE
EXTRACT(YEAR FROM DATE(horasolicitud)) = ?
AND EXTRACT(MONTH FROM DATE(horasolicitud)) = ?
AND OT.estatus IN (2, 3, 7)
AND OT.idcliente NOT IN (5115, 4966)
AND OT.idcliente NOTNULL
И ошибка гласит::
ОШИБКА: синтаксическая ошибка в СТРОКЕ 91 или рядом с «И»: И ИЗВЛЕЧЬ(МЕСЯЦ С ДАТЫ(horasolicitud)) = ? ^ Состояние SQL: 42601 Символ: 3006
Я был бы очень признателен вам за помощь. Спасибо.
Комментарии:
1. Вы
?
заменили его фактическими значениями до того, как запустили его в pgadmin? если да, не могли бы вы поделиться полным sql-запросом с этими значениями в вопросе2. Вам нужно
?
заменить его каким-нибудь скалярным выражением, скорее всего, простым числовым литералом. Это исправит синтаксическую ошибку. Но использованиеextract
этого способа неоптимально, поскольку оно предотвращает использование индексов, вы должны заменить его сравнением диапазоновhorasolicitud >= '2021-01-01' AND horasolicitud < '2021-02-01'
, например, ограничить результаты январем 2021 года.