Ir al contenido


Foto

¿Existe alguna función que valida la fecha?


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

#1 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 15 diciembre 2014 - 01:13

¿Existe alguna función en firebird que me valide si una cadena del tipo '01.01.1980' es una fecha correcta?

Gracias por  su ayuda amigos.
  • 0

#2 Nikolas

Nikolas

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 604 mensajes
  • LocationMar del Plata / Bs As / Argentina

Escrito 15 diciembre 2014 - 05:41

cast seria lo más parecido.

http://firebirdmanua...nes-firebird/40
  • 0

#3 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 15 diciembre 2014 - 09:07

Gracias por la referencia amigo aunque no satisface mucho mi requerimiento y me explico por qué.

Hice un Procedimiento almacenado donde a partir de los substrings de una cadena genero un string que contiene una fecha. Lamentablemente por la mala captura cuando hago el cast se lanza un error en la base de datos y eso detiene el procedimiento almacenado. Mi intención es usar alguna función que valide si la fecha es convertible a date pues de no serlo que le asigne un nulo. De ahí mi requerimiento: Encontrar una función que valide si una cadena contiene una fecha válida o en su defecto si existe alguna manera de manejar excepciones dentro de los procedimientos almacenados.

Gracias por su ayuda amigos.
  • 0

#4 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 15 diciembre 2014 - 10:41

Hola.

A menudo tengo que importar datos de otras bases de datos, y me suelo encontrar con fechas en formato texto que hay que convertir a Firebird. Filtrando las fechas no válidas y reconociendo diferentes carácteres como separadores : 1-1-1900, 1.1.1900, 1/1/1900, ... ...

Así que me he hecho mi propia pseudo-función para manejarlas.

SET TERM ^ ;

CREATE PROCEDURE "XXX_Fecha" (
    VALOR VARCHAR(50))
RETURNS (
    FECHA TIMESTAMP)
AS
DECLARE VARIABLE DIA INTEGER;
DECLARE VARIABLE MES INTEGER;
DECLARE VARIABLE ANO INTEGER;
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE TMP VARCHAR(50);
begin
  FECHA = null;
  I = 1;
  while (substring(:VALOR from I for 1) not in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')) do begin
    I = I + 1;
  end
  TMP = '';
  while (substring(:VALOR from I for 1) in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')) do begin
    TMP = TMP || substring(VALOR from I for 1);
    I = I + 1;
  end
  DIA = cast(TMP as integer);
  while (substring(:VALOR from I for 1) not in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')) do begin
    I = I + 1;
  end
  TMP = '';
  while (substring(:VALOR from I for 1) in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')) do begin
    TMP = TMP || substring(VALOR from I for 1);
    I = I + 1;
  end
  MES = cast(TMP as integer);
  while (substring(:VALOR from I for 1) not in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')) do begin
    I = I + 1;
  end
  TMP = '';
  while (substring(:VALOR from I for 1) in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')) do begin
    TMP = TMP || substring(VALOR from I for 1);
    I = I + 1;
  end
  ANO = cast(TMP as integer);
  if (:ANO < 20) then ANO = 2000 + ANO;
  else if (:ANO < 100) then ANO = 1900 + ANO;
  TMP = cast(MES as varchar(20)) || '-' || cast(DIA as varchar(20)) || '-' || cast(ANO as varchar(20));
  FECHA = cast(TMP as TIMESTAMP);
  suspend;
  when any do exit;
end
^

SET TERM ; ^

Como puedes ver, transforma la cadena a formato americano (mes/dia/año) y hace un moldeado de tipo a timestamp, capturando el error si la fecha es incorrecta, para que se devuelva NUL.

Forma de uso : select FECHA from "XXX_Fecha"('1-1-1999')

Ejemplo, devolver un campo DIA y su valor timestamp de la Tabla DATOS :

select DIA, (select FECHA from "XXX_Fecha"(DIA))
from DATOS

Saludos


  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 15 diciembre 2014 - 11:11

Se que la función SIMILAR TO en Firebird 2.5+ acepta expresiones regulares, ¿se podrá con eso?

Saludos
  • 0

#6 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 15 diciembre 2014 - 11:16

Probaré sus sugerencias. Muchas gracias amigos Marc  y Ego...
  • 0

#7 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 15 diciembre 2014 - 02:01

Disculpas, Poliburro, sin ánimo de cambiar de rumbo.
Recientemente tuve inconvenientes con las fechas en firebird y noté que no tiene en cuenta el formato de Windows.
Nunca investigué mucho y solucioné las cosas de forma sencilla, pero lo que noté es que usa el formato DD/MM/AAAA y eso puede traer consecuencias al usarlo en controles dentro de una aplicación al utilizar cadenas en consultas en vez de parámetros.
Así, por ejemplo si le digo a Firebird:


delphi
  1. SELECT... bla bla... WHERE DIA BETWEEN '13/12/2014' and '14/12/2014',


lo convertirá en una fecha 12/13/2014 con el error seguro por la inexistencia de meses 13 y 14.

Entonces, lo que hago es utilizar parámetros y que las funciones de conversión de la biblioteca se encargue del resto.

  • 0




IP.Board spam blocked by CleanTalk.