• Publicidad

Problema con fechas en base de datos

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Problema con fechas en base de datos

Notapor kaeri » 2006-06-19 14:50 @660

Hola a todos

Tengo un problema con fechas. Mi problema es que voy a guardar fechas a una tabla de sql server y este tiene el formato de fecha corta, es decir, 01/06/06 entonces tengo que guardar la fecha como tipo fecha y en ese formato. ¿Qué tengo que utilizar para poder guardarla adecuadamente?
Avatar de Usuario
kaeri
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2004-08-19 12:05 @545
Ubicación: México

Publicidad

Notapor kidd » 2006-06-19 15:21 @681

Hola:

Te recomiendo que le heches un vistazo al módulo MySQL::DateFormat que te permite convertir fechas a MySQL y de regreso.

Por ejemplo:

Código: Seleccionar todo
 use MySQL::DateFormat;           

 my $fecha = '01/06/06';

 my $md = MySQL::DateFormat->new(format => 'us');

 print $md->toMySQL($fecha);    # imprime "2006-06-01"



Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor explorer » 2006-06-20 07:14 @343

Depende del módulo que estés usando para hablar con SQL Server.

Con Win32::SqlServer, en la sección de fechas, verás que pone que SQL Server intentará extraer la una fecha en formato ISO 8601, y si no, en la configuración regional de la máquina. El problema de este módulo es que no es compatible con DBI.

Con otros módulos, como Win32::ODBC, Win32::DBIODBC o DBD::ODBC, no dicen nada de esta interpretación.

Tendrás que hacer alguna prueba, y si no funciona, deberás formatear la fecha al formato que indicas, antes de pasarla a la base de datos.

Yo intentaría primero pasarla en formato ISO 8601.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor kaeri » 2006-06-20 10:45 @489

¿Cómo puedo cambiar de string a formato fecha?

Aqui obtengo la fecha de inicio y la separo por dia, mes y año

Código: Seleccionar todo
$docfecini=~ s/(\d+)\/(\d+)\/(\d+)/$1\/$2\/$3/;

$dia = $1;
$mes = $2;
$anio = $3;


Aqui la transformo en fecha para poder sumarle 366 dias

Código: Seleccionar todo
$fecha =DateTime->new(
    year => $3,
    month=> $2,
    day  => $1
);
$fecha =  $fecha->add( days => 366 )->dmy("/");
$fecha=~ s/(\d+)\/(\d+)\/(\d+)/$1\/$2\/$3/;

$dia2 = $1;
$mes2 = $2;
$anio2 = $3;



Y aqui le quito dos digitos al año

Código: Seleccionar todo
$anio = substr($anio,2,2);
$anio2 = substr($anio2,2,2);


Aqui obtengo los valores haciendo la fecha que necesito el cual debe de ser 20/06/06
Código: Seleccionar todo
$docfecini= "$dia/$mes/$anio";
$fecha= "$dia2/$mes2/$anio2";


Pero creo que el ultimo formato esta en string entonces lo que necesito es cambiarlo a tipo fecha para poder guardarlo en la tabla de sql server el cual tiene en la tabla el campo definido como datetime en formato corto
ya obteniendo estos valores lo intento guardar en la tabla de sql server pero no me guarda nada ¿cómo le puedo hacer?
Avatar de Usuario
kaeri
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2004-08-19 12:05 @545
Ubicación: México

Notapor explorer » 2006-06-20 12:19 @554

A ver... en Perl no existe un tipo de dato fecha. Sólo hay valores escalares, estando entre ellos las cadenas de caracteres (strings).

Tu código, escrito de otra manera, es:
Código: Seleccionar todo
my $docfecini = "01/06/2006";
my ( $dia, $mes, $anio ) = $docfecini =~ m/(\d+)\/(\d+)\/(\d+)/;
my $fecha = DateTime->new ( year => $anio, month => $mes, day => $dia )->add ( days => 366 )->dmy('/');
my ( $dia2, $mes2, $anio2 ) = $fecha =~ m/(\d+)\/(\d+)\/(\d+)/;

$anio = substr($anio,  -2);
$anio2= substr($anio2, -2);

$docfecini = "$dia/$mes/$anio";
$fecha     = "$dia2/$mes2/$anio2";
print $docfecini; # 01/06/06
print $fecha;     # 02/06/07


El resultado sale bien. Obtenemos una fecha con un año y un día de diferencia.

Otra forma de hacerlo:
Código: Seleccionar todo
#!/usr/bin/perl -l
use DateTime;
use DateTime::Format::Strptime;
use strict;
use warnings;

my $FMT_FECHA_IN  = '%d/%m/%Y';# Formato de fecha de entrada
my $FMT_FECHA_OUT = '%d/%m/%y';# Formato de fecha de salida

my $docfecini = "20/06/2006";  # Dia/Mes/Año

## Formato de nuestra fecha
my $fecha_parse = DateTime::Format::Strptime->new(
   pattern   => $FMT_FECHA_IN,
   locale    => 'es_ES',
   time_zone => 'Europe/Madrid',
   on_error  => 'croak',
);

my $fechaini = $fecha_parse->parse_datetime( $docfecini );
my $fechaend = $fechaini->clone->add( days => 366 );

my $fecha1 = $fechaini->strftime($FMT_FECHA_OUT);
my $fecha2 = $fechaend->strftime($FMT_FECHA_OUT);

print $fecha1; # 20/06/06
print $fecha2; # 21/06/07
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2006-06-20 12:20 @555

Antes de guardar los valores a la base de datos, sácalos a pantalla. ¿Qué es lo que sale?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor kaeri » 2006-06-20 12:32 @564

¿para qué utilizas esto?
Código: Seleccionar todo
## Formato de nuestra fecha
my $fecha_parse = DateTime::Format::Strptime->new(
   pattern   => $FMT_FECHA_IN,
   locale    => 'es_ES',
   time_zone => 'Europe/Madrid',
   on_error  => 'croak',
);
Avatar de Usuario
kaeri
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2004-08-19 12:05 @545
Ubicación: México

Notapor explorer » 2006-06-20 12:59 @582

En ese trozo de código defino un parseador de fechas... digo cómo son las fechas que voy a usar como entrada.

La variable $fecha_parse se convierte en un objeto DateTime::Format::Strptime y a partir de ese momento es capaz de convertir a objetos DateTime todos los strings que le demos, con el formato de fecha que le indicamos al principio (esto es, sólo hay que hacer esta línea una vez en el programa).

Lo único importante es pattern, en que le indicamos el patrón con el formato de fecha que queremos parsear. Lo demás (locale, time_zone, on_error) es sólo necesario si quiero tener un control más exacto sobre el parseo (le estoy diciendo que las fechas están en mi idioma, en mi huso horario y si ocurre algún error, que termine inmediatamente).

Otra forma de hacerlo es con el módulo DateTime::Format::Builder.

Si quieres ver otras formas de leer fechas, en este mismo foro, en un hilo que tu mismo empezaste:
viewtopic.php?t=652
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor kaeri » 2006-06-21 13:04 @586

He colocado el código que me comentas pero lo raro es que cuando lo imprimo en la plantalla se ve odo bien pero cuando hago la inserción a la base de datos no lo lleva a cabo, lo he intentado de varias formas pero no me quiere guardar el valor correctamente. :(
Avatar de Usuario
kaeri
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2004-08-19 12:05 @545
Ubicación: México

Notapor explorer » 2006-06-21 13:23 @599

Eso es que la base de datos no está interpretando bien el formato de fecha que le estás pasando...

A ver... ¿Has probado a meter en la base de datos un cierto valor de fecha fijo en un determinado registro para ver si lo admite? ¿Qué dice el registro (log) de actividad del Server?

Es posible que el día y el mes estén cambiados de orden, o que no admite años con sólo dos dígitos.

Yo como no uso Microsoft ni mucho menos SQL Server, no puedo confirmar esto, pero la documentación que he leído dice que primero intenta leer una fecha en formato ISO 8601, y luego una fecha en el formato regional que tengas definido en tu máquina.

Prueba a pasarle primero la fecha 20060621 para ver si la admite. Si sí lo hace, es mejor que te pases a procesar las fechas en formato ISO 8601.

Si no, prueba con la configuración regional de tu ordenador. Vete a Panel de Control, Configuración regional, y busca por el formato que tiene la Fecha.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 11 invitados