Inicio

Novedades de pgsql en la 7.0

Entrevista con Bruce Momjian

Manejo de Estilos de Fechas en PostgreSQL

Introducción a los Triggers en C para PostgreSQL

Ligas interesantes

Formato de entrada de fechas y horas

La entrada de fechas y horas (date y time) se puede hacer de varias maneras, ya sea usando el estilo ISO-8601 o el tradicional de postgresqldocs. Es muy importante que el usuario o programador de postgresqldocs use explicitamente un estilo definido para la captura de las fechas y horas, pues de esta manera evita la ambigüedad que se genera al suponer que el postmaster recibirá cualquier cosa que le enviemos.

El formato de entrada para fechas y horas se especifica con el comando: SET DateStyle TO 'estilo_deseado';

Puesto que los diversos formatos son ambiguos respecto al orden de el día y la fecha, es que existen las opciones European y NonEuropean. Obviamente el estilo European es que se conforma con la manera en que lo usamos en losa paises hispano-americanos, así que es el con seguridad debemos fijar en nuestros programas de captura.

Los estilos ISO , SQL , Postgres y German no modifican el orden del mes y el día, solamente cambian el separador entre los valores numéricos de la fecha y, en caso del estilo Postgres, las posiciones de las cadenas de nombre del día, nombre del mes y número del día.

El script siguiente muestra la manera en que es interpretada una fecha ambigua en función del estilo de facha establecido. Nótese que la fecha '1/8/2000 11:43:10' puede significar 'primero de agosto' u 'ocho de enero'.

#!/usr/bin/perl -w

# La vida es simple con DBI
use DBI;

# Base de datos de prueba
$dbname = 'pruebas';

# Conexión a la base de datos
$dbh = DBI -> connect("dbi:Pg:dbname=$dbname");

# Más vale...
defined ($dbh) or die "No pude conectar a la base de datos.\n";

# Fijamos el estilo de salida a 'Postgres'
$dbh->do("SET DATESTYLE TO 'Postgres'");

# Arreglo de estilos de entrada para postgresql 7.x
@estilos_entrada= qw(Postgres ISO SQL German);
@estilos_salida = qw(NonEuropean European);

# Escogemos una fecha ambigua, puede ser 1 de agosto u 8 de enero!!!
$fecha_entrada = '1/8/2000 11:43:10';

foreach $estilo_1 (@estilos_entrada) { 
	$dbh->do("SET DATESTYLE TO '$estilo_1'");
	print "\n                      Estilo 1: $estilo_1\n";
	# Visitamos cada estilo y hacemos la consulta
	foreach $estilo_2 (@estilos_salida) {
		# Nuestra sentencia SQL modifica fecha de contratación de una persona
		$sql = "UPDATE persona set fecha_actualizacion = '$fecha_entrada' WHERE id_persona = 1;";
		$dbh->do("SET DATESTYLE TO '$estilo_2'");
		$sth=$dbh->prepare($sql);
		$sth->execute;
		print "Estilo 2: $estilo_2\nEntrada: $fecha_entrada, ";
	
		# Consultamos el registro para observar como se modificó 
		$sql= "SELECT fecha_actualizacion FROM persona WHERE id_persona = 1;";
		$sth=$dbh->prepare($sql);
   	 $sth->execute;
		while ( @row = $sth->fetchrow_array ) {
			print " Salida: $row[0]\n";
		}
	}
}

El resultado de la ejecución del script es el siguiente. Observe que usando el estilo Postgres es más facil visualizar que la cadena de entrada fue interpretada de diferente manera en función del Estilo 2; en cambio, con el estilo SQL permanece la duda acerca de la manera en que entró la fecha, aunque recordando que este estilo se modifica en la salida según sea europeo o no, es claro que en el primer caso la fecha es 'enero 8 de 2000' y en el segundo 'agosto 1 de 2000', como lo esperábamos. Note que la salida de los estilos ISO y German son insensibles: siempre serán 'aaaa.mm.dd' y 'dd.mm.aaaa', respectivamente.

                      Estilo 1: Postgres
Estilo 2: NonEuropean
Entrada: 1/8/2000 11:43:10,  Salida: Sat Jan 08 11:43:10 2000 CST
Estilo 2: European
Entrada: 1/8/2000 11:43:10,  Salida: Tue 01 Aug 11:43:10 2000 CDT

                      Estilo 1: ISO
Estilo 2: NonEuropean
Entrada: 1/8/2000 11:43:10,  Salida: 2000-01-08 11:43:10-06
Estilo 2: European
Entrada: 1/8/2000 11:43:10,  Salida: 2000-08-01 11:43:10-05

                      Estilo 1: SQL
Estilo 2: NonEuropean
Entrada: 1/8/2000 11:43:10,  Salida: 01/08/2000 11:43:10.00 CST
Estilo 2: European
Entrada: 1/8/2000 11:43:10,  Salida: 01/08/2000 11:43:10.00 CDT

                      Estilo 1: German
Estilo 2: NonEuropean
Entrada: 1/8/2000 11:43:10,  Salida: 08.01.2000 11:43:10.00 CST
Estilo 2: European
Entrada: 1/8/2000 11:43:10,  Salida: 01.08.2000 11:43:10.00 CDT