(PHP) Manejo de Fechas

Publicado por Don_Gusanito, Diciembre 09, 2005, 15:37:49

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Don_Gusanito

Lo que quiero hacer es mas que sencillo pero no se como.
Tengo una tabla en mi base con los campos id date y text.
El tema es que quiero hacer una seleccion de los las fechas futuras inclusive la del dia de la fecha. No se si se entiende en otras palabras seria mostrar el dia de hoy y los que vienen pero no los que ya pasaron.
Y si tienen tiempo enseñenme a agarrar la mas proxima osea 1 sola fecha, la que viene.

Gracias espero que puedan ayudarme como de costumbre.

coquisp

$sql = "select * from tu_tabla
           where fecha >= curdate()";
..............

curdate-> trae la fecha actual, acordate q el formato para guardar fechas en MySQL es 'yyyy-mm-dd', o no se q q motor usas si es access cambia la cosa ya q las fechas se encierran entre ##, y sql server varia bastante la funcion para fecha es getdate(),cualquier cosa te paso mi mail, coquisp@hotmail.com
si no entendiste mandame un mail

Don_Gusanito

gracias, voy a probar y dps comento

Predicador

Algo que se usa mucho es al momento de definir las estructuras de las tablas, las fechas no se guardan como fechas (ya que siempre son problematicas) sino como enteros de la forma YYYYMMDD [el software se encarga de armarlo haciendo fecha = (año * 10000) + (mes * 100) + dia] y de ese modo te evitas ser server dependiente (ya que cada server puede guardar la fecha de una forma distinta) ademas que te evitas de laburar con el tipo date que es medio pedorro.
Baii
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

Don_Gusanito

Predicador no me armarias un ejemplo sensillo como para arrancar?

Predicador

A ver, supongamos que tenes un formulario web donde una persona debe ingresar su nombre y fecha de nacimiento y debes almacenarla en una base de datos. Lo que haremos es tomar cada parte de la fecha (dia, mes y año) como un campo separado y se la pasamos al script para que la guarde en la base de datos:
<?
# Tomamos las variables que nos manda el form
$nombre = quitar_cosas_raras($HTTP_GET_VARS["nombre"]);
$dia = intval($HTTP_GET_VARS["d"]);
$mes = intval($HTTP_GET_VARS["m"]);
$ano = intval($HTTP_GET_VARS["a"]);

# Aca se podrian poner controles para ver si la fecha es existente

# Componemos la fecha como un Integer
$fecha = ($ano * 10000) + ($mes * 100) + $dia;

# Creamos el string de insercion en la DB
$sql = "INSERT INTO Persona (nombre, fecha) VALUES ('".$nombre."', $fecha)";

# Luego hacemos lo que se conecta a la DB y se hace efectiva la insercion.
# No importa demostrar como es eso, ya saben hacerlo, sino esta en otro post.
?>

Es claro que el campo fecha en la tabla Persona es de tipo INT, luego una fecha, por ejemplo el 14/06/2006 sera almacenado como 20060614 (o sea, YYYYMMDD).
Luego si queremos un listado de las personas que nacieron entre dos fechas, hacemos:
<?
# Tomamos las variables que nos manda el form
$dia1 = intval($HTTP_GET_VARS["d1"]);
$mes1 = intval($HTTP_GET_VARS["m1"]);
$ano1 = intval($HTTP_GET_VARS["a1"]);

$dia2 = intval($HTTP_GET_VARS["d2"]);
$mes2 = intval($HTTP_GET_VARS["m2"]);
$ano2 = intval($HTTP_GET_VARS["a2"]);

# Aca se podrian poner controles para ver si las fechas son existentes

# Componemos las fechas como un Integer
$fecha1 = ($ano1 * 10000) + ($mes1 * 100) + $dia1;
$fecha2 = ($ano2 * 10000) + ($mes2 * 100) + $dia2;

# Creamos el string de seleccion en la DB
$sql = "SELECT nombre FROM Persona WHERE fecha BETWEEN $fecha1 and $fecha2";

# se ejecuta el SELECT y se muestran los resultados
?>


Esta forma de representar las fechas nos ahorra muchos problemas (varios servers pueden manejar la fecha de forma distinta, formateo de fecha de acuerdo al pais, etc) pero tambien nos genera otros nuevos, ya que debemos escribir un poco mas de codigo para tratar las fechas y a veces hasta debemos escribir funciones para sumar fechas y cosas asi.

Ah, y antes que me olvide, aca el codigo de como obtener el dia, mes y año de acuerdo a una fecha almacenada como INT en una tabla:
<?
# descomposicion de una fecha com INT en mes dia ano
# $fecha es la fecha que nos devolvio un query de SQL

$temp = $fecha;
$dia = $temp % 100;          # toma los ultimos dos digitos
$temp = intval($temp / 100); # elimina los ultimos dos digitos
$mes = $temp % 100;          # toma los ultimos dos digitos
$ano = intval($temp / 100);  # elimina los ultimos dos digitos

#listo, ya tenemos $ano, $mes y $dia
?>

Facilmente se peude crear un archivo que incluya manejo de fachas (componer, descomponer, sumar, restar, diferencia, etc) y luego reusar en todos tus proyectos, es mas, no me soprenderia que esa libreria ya exista y sea ditribuida bajo licencia GPL.
Baii y espero que estas mini demostraciones hayan sido buenas y entendibles.



En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

Don_Gusanito

Predicador, muchas gracias, te sigo preguntando si no te molesta.
Como trabajo con la fecha actual con este metodo que posteaste. Supongamos:
Un usuario se da de alta y tengo que guardar el sysdate o tengo una tabla de noticias y tengo que mostrar las del mes pasado, cosas asi. Podrias explicarlo? Gracias nuevamente

Predicador

Hola, te recuerdo que este es solo una de las miles de formas que hay para trabajar con fechas.
Ahora, intentando responder tu pregunta:
<?php
# toma la fecha actual del sistema de acuerdo a nuestro formato
# luego puede ser insertada en una tabla
$fecha_actual date("Ymd"time()); # el time() es redundante en este caso

# resta 30 dias de acuerdo a la fecha actual
$last_days date("Ymd"time() - (30 24 60 60)); # 30 dias; 24 horas; 60 min; 60sec
# busca las noticias con no mas de 1 mes de viejas
$sql "SELECT * FROM Noticias WHERE $fecha_actual >= $last_days";

?>


Otra forma de manejar las fechas seria almacenar nuevamente las fechas como un INT en sql, pero desde el lenguaje de programacion (en este caso PHP) serian unix timestamps (que en fin es el entero que devuelve PHP al usar la funcion time()) luego lo podes trabajar nativamente en php y solo se hacen formateos a la hora de mostrar la informacion. Puede traer problemas si la DB tambien sera leida por algun otro lenguaje que ni soporte los unix timestamps. No sirve si las fechas a almacenar son anteriores a 1970.
Baii.
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

elrosti

Predicador........... Sos groso, Sabelo.................

Nunca habia pensado en hacer lo que decis con las fechas.................puede ser una buena salido para cuando dan problemas, aunque PHP tiene una larga y completa lista de funciones para trabajar con fechas y calendarios.
Yo no lo quería creer..... pero ella me convenció.