Ir al contenido


Foto

Problema con SP y resultado de resta entre dos tiempos


  • Por favor identifícate para responder
6 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 18 octubre 2010 - 12:18

Pues eso, tengo problemas con un procedimiento almacenado en Firebird, donde el resultado de una resta entre dos tiempos me ocasiona un error que más abajo presentaré, el SP es el siguiente:



sql
  1. CREATE OR ALTER PROCEDURE LISTAASISTENCIA (
  2.     id INTEGER,
  3.     fdesde DATE,
  4.     fhasta DATE)
  5. RETURNS (
  6.     ast_id INTEGER,
  7.     emp_id INTEGER,
  8.     ast_fecha DATE,
  9.     ca_id INTEGER,
  10.     ast_time1 TIME,
  11.     ast_time2 TIME,
  12.     lapso TIME,
  13.     nombre_dia VARCHAR(15))
  14. AS
  15. DECLARE variable cuantos INTEGER;
  16. BEGIN
  17. /* Recorre las asistencias entre las fechas */
  18. FOR
  19. SELECT ast_id, emp_id, ast_fecha, ca_id, ast_time1,
  20. ast_time2, CAST((ast_time2 - ast_time1) AS TIMESTAMP) AS lapso
  21. FROM
  22. Asistencia
  23. WHERE
  24. AST_FECHA >= :fdesde AND
  25. AST_FECHA <= :fhasta AND emp_id = :ID ORDER BY emp_id, ast_fecha
  26. INTO :ast_id, :emp_id, :ast_fecha, :ca_id, :ast_time1, :ast_time2, :lapso do
  27. BEGIN
  28. SELECT COUNT(*) FROM dias_horarios dh WHERE dh.hora_id = (SELECT EMP_turno FROM empleados E WHERE E.emp_id = :emp_id) AND dh.dia_id = EXTRACT(weekday FROM :ast_fecha) INTO :cuantos;
  29. IF (:cuantos > 0) THEN
  30. BEGIN
  31. SELECT DIA_NOMBRE FROM DIAS WHERE DIA_ID = EXTRACT(weekday FROM :ast_fecha) INTO :nombre_dia;
  32. suspend;
  33. END
  34. END



El error está en el anexo, a qué se debe ese problema??, ya se le hizo un CAST tipo TIMESTAMP y ocasiona el mismo error.

Saludos

Archivos adjuntos


  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 18 octubre 2010 - 01:12

Buenas,

Has probado a lanzar el SQL desde una ventana de SQL? Para descartar errores en la sentencia.

Si la sentencia está bien, podría ser que ast_time2 y ast_time1 son tipo Time, en cambio haces un cast a timestamp.

Prueba a mirar por ahí a ver qué

Nos leemos

  • 0

#3 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 18 octubre 2010 - 03:08

Saludos.

Si tienes la versión 2.1 puedes probar la función DATEDIFF.
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 21 octubre 2010 - 10:19

[quote name="cadetill" post="41808" timestamp="1287429153"]
Buenas,

Has probado a lanzar el SQL desde una ventana de SQL? Para descartar errores en la sentencia.

Si la sentencia está bien, podría ser que ast_time2 y ast_time1 son tipo Time, en cambio haces un cast a timestamp.

Prueba a mirar por ahí a ver qué

Nos leemos

[/quote]

Ambos campos son TIME al igual que el parametro de salida LAPSO es tipo TIME, hice el cast solo para ver el resultado ya que sin CAST o no el error es el mismo.

[quote author=Rolphy Reyes link=topic=4028.msg41813#msg41813 date=1287436138
Si tienes la versión 2.1 puedes probar la función DATEDIFF.
[/quote]

Gracias por la repuesta Rolphy, pero esa funcion solo se aplica a fechas? tambien se aplica a TIME??.

Saludos.
  • 0

#5 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 21 octubre 2010 - 11:14

Hola.

Yo también utilizaría la función DATEDIFF.

Respecto a tu código. ¿ Estás seguro que la resta de dos campos time será timestamp ?. La verdad es que nunca he utilizado campos time, pero me parece curioso que la resta la declares de tipo timestamp y la intentes asignar a una variable declarada como time. ¿ En este caso no deberías haber declarado también lapso de tipo timestamp ?.

Saludos.
  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 21 octubre 2010 - 11:29

Lo que pasa es que fue una prueba para ver si el resultado no mostraba error, y pegue la consulta que no era, perdon :D :D, bueno, con DATEDIFF funcionaria la diferencia entre dos horas??.

Saludos.
  • 0

#7 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 21 octubre 2010 - 12:08

Saludos.

Extraído del Release Note de Firebird 2.1.3

DATEDIFF Returns an exact numeric value representing the interval of time from the first date/time/timestamp value to the second one.

Format:


sql
  1. DATEDIFF( <timestamp_part> FROM <date_time> TO <date_time> )
  2. DATEDIFF( <timestamp_part>, <date_time>, <date_time> )
  3. timestamp_part ::= { YEAR | MONTH | DAY |
  4. HOUR | MINUTE | SECOND | MILLISECOND }



1. Returns a positive value if the second value is greater than the first one, negative when the first one is greater, or zero when they are equal.

2. Comparison of date with time values is invalid.

3. YEAR, MONTH, and DAY cannot be used with time values.

4. HOUR, MINUTE, SECOND and MILLISECOND cannot be used with date values.

5. All timestamp_part values can be used with timestamp values.

Example


sql
  1. SELECT datediff(DAY, (CAST('TOMORROW' AS DATE) -10), CURRENT_DATE)
  2. AS datediffresult
  3. FROM rdb$database;



  • 0




IP.Board spam blocked by CleanTalk.