Curso
Algunas de las funciones más útiles en implementaciones de SQL como Postgres (por ejemplo, Amazon Redshift) son DATE_DIFF y DATE_TRUNC:
DATE_DIFFdevuelve el tiempo transcurrido entre dos fechas. Por ejemplo, el siguiente código daría el número de días entredate1ydate2:
DATE_DIFF('day', date1, date2)
DATE_DIFF es ideal para calcular los días desde el alta hasta la baja, o las horas desde el inicio de sesión hasta el cierre de sesión.
DATE_TRUNCrecorta una fecha al día, semana, mes o año más cercano. Por ejemplo, el siguiente código devolvería el lunes más próximo al timestampmy_timestamp:
DATE_TRUNC('week', my_timestamp)
DATE_TRUNC es perfecto para agregar datos. Por ejemplo, podemos usarlo para obtener el número de usuarios activos mensuales (MAU) truncando a la fecha de inicio de mes más cercana.
Pero no todas las implementaciones de SQL tienen estas funciones tan útiles. Para nuestro código de Learn SQL desde cero, usamos SQLite, una implementación ligera de SQL que puede ejecutarse en una sola instancia de Docker. SQLite es genial para backends web y proyectos pequeños, pero le faltan mis dos funciones favoritas. Por suerte, hay alternativas.
Para emular DATE_DIFF, podemos usar una función poco conocida llamada juliandate. Según Wikipedia, «el número de día juliano (JDN) es el entero asignado a un día solar completo en el cómputo de días julianos a partir del mediodía en tiempo universal, siendo el número 0 el asignado al día que empieza al mediodía del lunes, 1 de enero de 4713 a. C.». Al convertir una fecha en un número de coma flotante, podemos restar para obtener la diferencia entre dos marcas de tiempo.

Incluso podemos convertir el resultado a horas multiplicando por 24 o a minutos multiplicando por 24 * 60.
Podemos emular parte de la funcionalidad de DATE_TRUNC usando strftime. Esta función convierte un timestamp en una cadena con el formato que indiquemos.
%d día del mes: 00 %f segundos fraccionarios: SS.SSS %H hora: 00-24 %j día del año: 001-366 %J número de día juliano %m mes: 01-12 %M minuto: 00-59 %s segundos desde 1970-01-01 %S segundos: 00-59 %w día de la semana 0-6 con domingo==0 %W semana del año: 00-53 %Y año: 0000-9999
Normalmente, podríamos usar esto para convertir entre formatos de fecha distintos, como de YYYY-MM-DD a MM-DD-YYYY:
strftime('%M-%D-%Y', mydate)
Pero también podemos elegir el formato con picardía para truncar en el punto adecuado. Por ejemplo, si queremos truncar al mes, podemos hacer:
strftime('%M/%Y', mydate)
O truncar a la semana usando:
strftime('%Y-%w', mydate)
Con estos dos trucos sencillos, podrás usar SQLite para hacer algunos de los mismos análisis potentes que en Amazon Redshift.
Si quieres aprender más sobre los fundamentos de SQL, haz el curso Intro to SQL for Data Science de DataCamp y echa un vistazo a nuestro SQL Tutorial for Beginners.
