Funciones de fechas en MySQL

1,531 views
Skip to first unread message

Guido

unread,
Mar 13, 2009, 6:22:50 PM3/13/09
to PHP Argentina
Este topic tiene mas que ver con MySQL que con PHP, pero me parece
bueno compartirlo porque el 90% de los trabajos que hacemos en PHP
usan bases de datos.

Hace un tiempo, buscando datos sobre fechas para hacer una consulta en
MySQL encontre unas funciones que son muy utiles, por ej:

Para insertar una fecha a un campo timestamp podemos usar FROM_UNIXTIME
($date) donde $date es la fecha en formato unix.

En esa consulta que yo tenia que hacer, necesitaba agrupar por fecha,
pero como en el timestamp tenia guardado aaaa-mm-dd hh:mm:ss
necesitaba alguna forma de agrupar teniendo solo en cuenta el año, el
mes y el dia para obtener la maxima cotizacion del dolar en ese dia.
la consulta quedó algo así:

SELECT MAX(venta) as venta FROM cotizaciones GROUP BY YEAR(date) ,
MONTH(date), DAY(date)

Por otro lado, tambien podemos usar estas funciones para extraer los
datos de la db por ej.

SELECT YEAR(date) as year , MONTH(date) as month, DAY(date) as day
FROM cotizaciones


Me pareció importante compartirlo porque he visto por varias paginas
muchos codigos php para hacer exactamente estas cosas.

El que ya tenia conocimiento de estas funciones tal vez puede aportar
algo mas, y al que no, espero que les sirva...

Sebastian Choren

unread,
Mar 14, 2009, 1:37:53 PM3/14/09
to php...@googlegroups.com
Esa de YEAR, MONTH y DAY no las tenia. Estan muy buenas. Gracias por la data
Sebastián Choren


2009/3/13 Guido <guido...@gmail.com>

HQ063

unread,
Mar 15, 2009, 7:53:19 PM3/15/09
to PHP Argentina
agrego, supongo que una vez que conocidas las funciones ya se ñes
habra ocurrido este otro uso, pero por las dudas... también se puede,
utilizar para obtener datos resumidos por mes o por año, como por
ejemplo...
SELECT SUM(cantidad), SUM(importe) FROM ventas GROUP BY YEAR(fecha),
MONTH(fecha)
o incluso también por otro tipo de periodos, como semanas o
bimestres... No se si es la forma mas optima en todos los casos, pero
es una posibilidad.
SELECT YEAR(fecha) as año, TRUNCATE((MONTH(fecha)-1)/2,0)+1 as
bimestre, SUM(cantidad), SUM(importe) FROM `Partidos` GROUP BY 1,2

Pablo Impallari

unread,
Mar 16, 2009, 4:56:55 AM3/16/09
to PHP Argentina
@HQ063: Hay una forma más fácil de traer periodos (años, semanas o lo
que sea)

SELECT *FROM mitabla WHERE fecha >= DATE_SUB(CURDATE(),INTERVAL 3
MONTH)
Trae los datos de los ultimos 3 meses. O sea, usar date_sub e
interval.

Igual el tema de las fechas siempre es complicado... hay que renegar
un poco hasta encontrar la forma justa.
Pero tengan ojo, que todas estas funciones son "específicas" de MySql
y no funcionan con otras bases de datos.

Por ahí lo que recomiendan en varios lugares es usar timestamps en
lugar de datetimes, y después hacer los calculos con strtotime.
Acá les dejo el link a un post con una discusión interesante sobre el
tema:
http://forum.kohanaphp.com/comments.php?DiscussionID=1404&page=1#Item_27

Saludos
Pablo Impallari

Tordek

unread,
Mar 16, 2009, 10:59:19 AM3/16/09
to php...@googlegroups.com
Pablo Impallari wrote:
> @HQ063: Hay una forma más fácil de traer periodos (años, semanas o lo
> que sea)
>
> SELECT *FROM mitabla WHERE fecha >= DATE_SUB(CURDATE(),INTERVAL 3
> MONTH)
> Trae los datos de los ultimos 3 meses. O sea, usar date_sub e
> interval.
>

Cuidado con usar funciones (no sólo de fecha, sino de cualquier
tipo) en un WHERE, porque dejás de usar los índices, y se puede
poner muy lento.

Ahora no sé dónde estará el link, pero hay una «historia de guerra»
de cómo una función en el lugar inapropiado hizo que una consulta
que tomaba un par de segundos tarde un par de días, y la
optimización aplicada.


--
Guillermo O. «Tordek» Freschi. Programador, Escritor, Genio Maligno.
http://tordek.com.ar :: http://twitter.com/tordek
http://www.arcanopedia.com.ar - Juegos de Rol en Argentina

Pablo Impallari

unread,
Mar 16, 2009, 12:24:28 PM3/16/09
to PHP Argentina
Una razón más para usar timestamps.
> Guillermo O. «Tordek» Freschi. Programador, Escritor, Genio Maligno.http://tordek.com.ar::http://twitter.com/tordekhttp://www.arcanopedia.com.ar- Juegos de Rol en Argentina
>
>  smime.p7s
> 4 KVerDescargar

HQ063

unread,
Mar 16, 2009, 12:56:06 PM3/16/09
to PHP Argentina
Si bien esa forma sirve para lo que vos decis, no

On 16 mar, 05:56, Pablo Impallari <impall...@gmail.com> wrote:
> @HQ063: Hay una forma más fácil de traer periodos (años, semanas o lo
> que sea)
>
> SELECT *FROM mitabla WHERE fecha >= DATE_SUB(CURDATE(),INTERVAL 3
> MONTH)
> Trae los datos de los ultimos 3 meses. O sea, usar date_sub e
> interval.

La query que puse yo no trae ese tipo de datos, sino que trae un
resumen de TODA la tabla agrupado por intervalos de tiempo, lo que vos
estas sugiriendo solo trae los últimos 3 meses y sin ninguna
agrupación.

> Pero tengan ojo, que todas estas funciones son "específicas" de MySql
> y no funcionan con otras bases de datos.

No se si en todas, pero year, month y day en SQL Server también
funcionan

Pablo Impallari

unread,
Mar 17, 2009, 5:36:39 PM3/17/09
to PHP Argentina
Obiamente que mi consulta no agrupa nada, porque queria mantener la
consulta simple para que se notara a simple vista las funciones de la
fecha, que es el tema de este hilo, no?
Reply all
Reply to author
Forward
0 new messages