Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   CAST en sentencia CASE (https://www.clubdelphi.com/foros/showthread.php?t=93965)

mRoman 28-05-2019 02:19:39

CAST en sentencia CASE
 
Hola amigos....

Estoy trabajando con Firebird 2.0 y delphi 6

Estoy tratando de ejecutar este query:
Código SQL [-]
select LPAD(a.registro_id,6,'0') as registro_id,
       LPAD(a.folio_ticket_comanda,6,'0') as ticket,
       a.registro_id as registro_id2,
       current_date  as fecha_hora_impresion,
       a.mesa_num||COALESCE(a.literal,'') as mesa,
       CASE
           when current_time>=cast('13:00:00' as time) THEN a.fecha_hora_registro
       else CAST( a.fecha_hora_registro as DATE )
       end as fecha_sin_hora,
       b.cantidad,
       b.consec,
       case b.cortesia
           when 'S' then b.precio*-1
           when 'N' then b.precio
       end as precio,
       b.comentario,
       CASE b.cortesia
          when 'S' then RTRIM( UPPER(c.prod_descripcion_corta) )||'-[CORTESIA]'
          when 'N' then RTRIM(UPPER(c.prod_descripcion_corta))
       end||' '||COALESCE(b.comentario,'') as prod_descripcion_corta,
       b.descripcion_producto,
       b.cortesia,
       UPPER((select d.alias_nombre
        from empleado d, asignacion_mesa e
        where d.empleado_id=e.empleado_id
          and e.mesa_num=a.mesa_num)) as mesero,
       f.um_descripcion_corta,
       h.descripcion as clasificacion
from comanda_maestro a,
     comanda_detalle b,
     producto c,
     unidad_medida f,
     categoria_producto g,
     clasif_categoria_producto h
where a.registro_id=b.registro_id
  and a.registro_id=:registro_id
  and b.producto_id=c.producto_id
  and c.um_id=f.um_id
  and c.categoria_id=g.categoria_id
  and g.id_clasificacion=h.id_clasificacion
order by h.descripcion

Les explico que quiero hacer: El cliente me pidio que en el ticket de una comanda, saliera impreso la hora siempre y cuando fuera mas de 1 pm (13:00:00) y que no se imprima si la hora es menor a la 1 p.m.

El problema esta aqui:

Código SQL [-]
       CASE
           when current_time>=cast('13:00:00' as time) THEN a.fecha_hora_registro
       else CAST( a.fecha_hora_registro as DATE )
       end as fecha_hora,

.... marca este error:

Código SQL [-]
Dynamic SQL Error.
SQL error code = -104.
Datatypes are not comparable in expression CASE.

Parece ser que la sentencia CASE no soporta este tipo de consultas en su estructura con la version de Firebird q estoy usando. Lo puedo solucionar creando un campo que solo almacene la fecha y el otro campo -que la tengo creado que por cierto es del tipo Timestamp- lo dejaria tal cual...y entonces lo resolveria con la sentencia case, pero en realidad quiero agotar esta opción, si no se puede usando case...pues ni modo creare el campo

Alguna otra idea de como se pudiera solucionar??.

Saludos.

manelb 28-05-2019 07:40:41

Saludos a todos...

He probado la consulta que propones en una versión 2.1 y allí si que funciona.

Una alternativa a lo que propones podría ser convertir la hora a string en lugar del string a hora...

¿Te serviría algo como esto?

Código SQL [-]
select hora_modificacion,
       CASE
         when cast(hora_modificacion as char(13))>='13' THEN hora_modificacion
         else current_time
       end as fecha_hora
 from  tbl_albaranes_venta_cab

Saludos

TOPX 28-05-2019 14:46:49

Hola...

Código SQL [-]
WHEN EXTRACT(HOUR FROM CURRENT_TIME) >= 13 THEN A.FECHA_HORA_REGISTRO

Fuente: EXTRACT() - Firebird 2.0 Language Ref.
-

mRoman 28-05-2019 23:37:51

Ok...gracias a todos por contestar.

Probare lo que me proponen y les comento....

Saludos.

mRoman 28-05-2019 23:38:27

Cita:

Empezado por TOPX (Mensaje 532200)
Hola...

Código SQL [-]
WHEN EXTRACT(HOUR FROM CURRENT_TIME) >= 13 THEN A.FECHA_HORA_REGISTRO

Fuente: EXTRACT() - Firebird 2.0 Language Ref.
-

Gracias por contestar.

mRoman 28-05-2019 23:38:57

Cita:

Empezado por manelb (Mensaje 532187)
Saludos a todos...

He probado la consulta que propones en una versión 2.1 y allí si que funciona.

Una alternativa a lo que propones podría ser convertir la hora a string en lugar del string a hora...

¿Te serviría algo como esto?

Código SQL [-]
select hora_modificacion,
       CASE
         when cast(hora_modificacion as char(13))>='13' THEN hora_modificacion
         else current_time
       end as fecha_hora
 from  tbl_albaranes_venta_cab

Saludos

Gracias por tu comentario.

mRoman 29-05-2019 02:05:58

Hola que tal...

Pues puse en práctica sus propuestas:

la de TOPX
Código SQL [-]
SELECT CURRENT_TIME,
       a.fecha_hora_registro,
       cast( a.fecha_hora_registro as date) as fecha2,
       CASE when EXTRACT(HOUR FROM CURRENT_TIME) >=13
            then a.fecha_hora_registro
       ELSE EXTRACT(day FROM a.fecha_hora_registro)||'/'||EXTRACT(month from a.fecha_hora_registro)||'/'||EXTRACT(year from a.fecha_hora_registro)
       END
from comanda_maestro a

Este QUERY funcionó, descomponiendo la fecha usando EXTRACT y concatenandola despues....

La propuesta de manelb

Código SQL [-]
SELECT CURRENT_TIME,
       a.fecha_hora_registro,
       cast( a.fecha_hora_registro as date) as fecha2,
       CASE
            when CAST(A.fecha_hora_registro AS CHAR(13)) >=13
            then a.fecha_hora_registro
       ELSE CURRENT_TIME
       END
from comanda_maestro a

No me fucionó marcó este error:
Código SQL [-]
Dynamic SQL Error.
SQL error code = -104.
Datatypes are not comparable in expression CASE.

De todas formas les agradezco su apoyo y orientación....

Muchas gracias...todavía estoy valorando mas opciones. Luego les comentaré como lo resolví.

mRoman 29-05-2019 03:31:52

Pues quedó asi:

Código SQL [-]
select LPAD(a.registro_id,6,'0') as registro_id,
       LPAD(a.folio_ticket_comanda,6,'0') as ticket,
       a.registro_id as registro_id2,
       current_date  as fecha_hora_impresion,
       a.mesa_num||COALESCE(a.literal,'') as mesa,
       CASE
           when EXTRACT(HOUR from current_time) >=13 then SUBSTR(a.fecha_hora_registro,1,19)
       ELSE EXTRACT(year FROM a.fecha_hora_registro)||'/'||
            LPAD(EXTRACT(month from a.fecha_hora_registro),2,0)||'/'||
            LPAD(EXTRACT(day from a.fecha_hora_registro),2,0)
       END as fecha_comanda,
       b.cantidad,
       b.consec,
       case b.cortesia
           when 'S' then b.precio*-1
           when 'N' then b.precio
       end as precio,
       b.comentario,
       CASE b.cortesia
          when 'S' then RTRIM( UPPER(c.prod_descripcion_corta) )||'-[CORTESIA]'
          when 'N' then RTRIM(UPPER(c.prod_descripcion_corta))
       end||' '||COALESCE(b.comentario,'') as prod_descripcion_corta,
       b.descripcion_producto,
       b.cortesia,
       UPPER((select d.alias_nombre
        from empleado d, asignacion_mesa e
        where d.empleado_id=e.empleado_id
          and e.mesa_num=a.mesa_num)) as mesero,
       f.um_descripcion_corta,
       h.descripcion as clasificacion
from comanda_maestro a,
     comanda_detalle b,
     producto c,
     unidad_medida f,
     categoria_producto g,
     clasif_categoria_producto h
where a.registro_id=b.registro_id
  and a.registro_id=:registro_id
  and b.producto_id=c.producto_id
  and c.um_id=f.um_id
  and c.categoria_id=g.categoria_id
  and g.id_clasificacion=h.id_clasificacion
order by h.descripcion

La parte azul es como quedó la consulta. Gracias a todos por su tiempo y sus aportaciones.


La franja horaria es GMT +2. Ahora son las 08:27:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi