Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-07-2010
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Question Sumarle a una fecha - hora (timestamp) una cierta cantidad de horas

Buenas, deseo que en una sql me haga la siguiente operación:
A cierta fecha (fecha y hora) le sume una cantidad de horas

Ejemplo:

15/07/2010 19:21:00 + 3 (horas) = 15/07/2010 22:21:00

¿Cómo puedo hacer esto dentro del select? Estuve probando con dateadd y no consigo buenos resultados.
Uso Firebird 2.1

gracias.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #2  
Antiguo 16-07-2010
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Bueno, conseguí solucionar el problema usando una UDF. La verdad es que funciona bien pero sería bueno si hay una forma de hacerlo sin funciones externas.
Bien, gracias.

Código SQL [-]
select rcd.fch_cobro,  rcd.fch_apertura_planilla, addhour(rcd.fch_apertura_planilla,  CAST(rve.valor as integer))
from registro_cobros_diarios rcd left outer join recupero_valor_entorno('HORAS_PLANILLA_ABIERTA') rve
    on rcd.fch_cobro = rcd.fch_cobro
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #3  
Antiguo 16-07-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Y qué hace esa udf?
Responder Con Cita
  #4  
Antiguo 16-07-2010
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Smile

Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿Y qué hace esa udf?
Simplemente le suma a una variable de tipo TIMESTAMP un valor INTEGER que se considera representa las horas.

addhour(fecha_hora, hora) --> le suma las horas a la fecha.

17/07/2010 20:52 + 3 = 17/07/2010 23:52
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #5  
Antiguo 16-07-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Es que si a una timestamp (fechahora) le sumas 3, por ejemplo, se lo suma a los días, no a las horas.
Un campo fechahora es un valor como, por ejemplo: 36468,36587491222
La parte entera son los días transcurridos desde 31-12-1899 y la parte decimal corresponde a las horas.
Entonces si 1 lo divides entre 24 te da el resultado de lo que ocupa una hora, multiplicado por 3 horas, el resultado sería: 0.125
Por lo tanto, si quieres sumar 3 horas a una fechahora, debes sumar esa cantidad: now + 0.125 = fechahora dentro de 3 horas
Según tu ejemplo:
17/07/2010 20:52 + 3 = 17/07/2010 23:52

Escribo de memoria, tendría que confirmarlo, pero creo que es así.
Responder Con Cita
  #6  
Antiguo 17-07-2010
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Gracias compañeros, entendí.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #7  
Antiguo 17-07-2010
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por santiago14 Ver Mensaje
Bueno, conseguí solucionar el problema usando una UDF. La verdad es que funciona bien pero sería bueno si hay una forma de hacerlo sin funciones externas.
Bien, gracias.

Código SQL [-]select rcd.fch_cobro, rcd.fch_apertura_planilla, addhour(rcd.fch_apertura_planilla, CAST(rve.valor as integer)) from registro_cobros_diarios rcd left outer join recupero_valor_entorno('HORAS_PLANILLA_ABIERTA') rve on rcd.fch_cobro = rcd.fch_cobro
¿Y cuál es el problema, impedimento, o motivo por el cual no aprovechar exactamente lo que ofrecen las UDF?
Dicho sea de paso: desde Firebird 2.1 ya casi no hay necesidad de registrar UDFs... ya que en su enorme mayoría vienen de "fábrica" incorporadas al motor.
Distinto es en F1.5 en donde se necesita registrarlas.
Las UDFs se estabilizaron durante el desarrollo de 2.x y además, desde (si no me falla la memoria) 2.5 se tiene pensado mejorar este punto y estandarizarlo ofreciendo los medios y herramientas para ello.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #8  
Antiguo 17-07-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Pero hay alguna que sume horas?, ¿cómo lo hace?
Responder Con Cita
  #9  
Antiguo 19-07-2010
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿Pero hay alguna que sume horas?, ¿cómo lo hace?
Hola amigo, se me ha estado olvidando este hilo. Disculpa.

¿Me lo preguntas a mi?
Internamente pues no sabría decir como hace la UDF para sumarle las horas .... de que si estoy seguro es que SI EXISTE ESTA UDF... ¡Esta disponible desde F1 para Windows y desde F1.5 en Linux.

Cita:
addHour

Library: fbudf
Added in: 1.0 (Win), 1.5 (Linux)
Description: Returns the first argument with number hours added. Use negative numbers to subtract.
Result type: TIMESTAMP
Syntax:
addhour (atimestamp, number)
Declaration:
DECLARE EXTERNAL FUNCTION addHour
TIMESTAMP, INT
RETURNS TIMESTAMP
ENTRY_POINT 'addHour' MODULE_NAME 'fbudf'
Fuente

¿O será que estoy interpretando mal tu pregunta? Me resulta extraño tu comentario amigo, sabiendo que tu conoces mucho de Firebird.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #10  
Antiguo 19-07-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bueno, más bien me preguntaba cómo sumará horas esa función, pero ya lo he mirado, suma segundos:

Código SQL [-]
ISC_QUAD * addhour (ISC_QUAD *date, int *hours)
{
  if (!date || !hours)
    return NULL;
  else
    return addseconds(date, 60 * 60 * *hours);
}




static ISC_QUAD * addseconds (ISC_QUAD *date, int seconds)
{
    struct tm t;
    isc_decode_date(date,&t);
    t.tm_sec += seconds;
    if (t.tm_sec >= 60) {
      t.tm_min  += (t.tm_sec / 60);
      t.tm_sec ٪= 60;
      t.tm_hour += (t.tm_min / 60);
      t.tm_min ٪= 60;
      t.tm_mday += (t.tm_hour / 24);
      t.tm_hour ٪= 24;
      while (t.tm_mday > daysoftsmonth(&t)) {
        t.tm_mday -= daysoftsmonth(&t);
        t.tm_mon++;
        if (t.tm_mon > 11) {
          t.tm_mon=0;
          t.tm_year++;
        }
      }
    }
    else if (t.tm_sec < 0) {
      t.tm_min += ((t.tm_sec - 59) / 60);
      if (t.tm_sec ٪ 60 == 0) {
        t.tm_sec = (t.tm_sec ٪ 60);
      }
      else {
        t.tm_sec = (t.tm_sec ٪ 60) + 60;
      }
      if (t.tm_min < 0) {
        t.tm_hour += ((t.tm_min - 59) / 60);
        if (t.tm_min ٪ 60 == 0) {
          t.tm_min = (t.tm_min ٪ 60);
        }
        else {
          t.tm_min = (t.tm_min ٪ 60) + 60;
        }
        if (t.tm_hour < 0) {
          t.tm_mday += ((t.tm_hour - 23) / 24);
          if (t.tm_hour ٪ 24 == 0) {
            t.tm_hour = (t.tm_hour ٪ 24);
          }
          else {
            t.tm_hour = (t.tm_hour ٪ 24) + 24;
          }
          while (t.tm_mday < 1) {
            t.tm_mon--;
            if (t.tm_mon < 0) {
              t.tm_mon = 11;
              t.tm_year--;
            }
            t.tm_mday += daysoftsmonth(&t);
          }
        }
      }
    }
    return (ISC_QUAD *) gen_ib_date(&t);
}


static int daysoftsmonth(struct tm *t)
{
  int month = t->tm_mon + 1;
  int year = t->tm_year + 1900;
  return intern_daysofmonth(month, year);
}
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Crear libro Excel con cierta cantidad de hojas MAXIUM Servers 2 05-07-2010 18:53:46
filtrar fecha y/o hora en un campo timestamp CarlosHernandez Firebird e Interbase 2 18-02-2010 18:09:28
concatenar fecha y hora en timestamp Vlady SQL 4 21-05-2008 17:51:04
Leer una cierta cantidad de caracteres de una archivo. mcalmanovici Varios 9 22-01-2008 20:01:24
Sacar la hora de un campo TimeStamp Vlady Conexión con bases de datos 1 15-02-2007 19:07:07


La franja horaria es GMT +2. Ahora son las 06:54:52.


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
Copyright 1996-2007 Club Delphi