ГДЕ ИЗВЛЕЧЬ PostgreSQL

#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 года.