El uso de funciones estándar de mysql es una forma de escribir una consulta que devolverá una lista de días entre dos fechas.
por ejemplo, dado 2009-01-01 y 2009-01-13, devolvería una tabla de una columna con los valores:
2009-01-01
2009-01-02
2009-01-03
2009-01-04
2009-01-05
2009-01-06
2009-01-07
2009-01-08
2009-01-09
2009-01-10
2009-01-11
2009-01-12
2009-01-13
Editar: Parece que no lo he tenido claro. Quiero GENERAR esta lista. Tengo valores almacenados en la base de datos (por fecha y hora) pero quiero que se agreguen en una combinación externa izquierda a una lista de fechas como se muestra arriba (espero que el lado derecho de esta combinación sea nulo durante algunos días y manejaré esto ).
mysql
sql
date
gaps-and-islands
Gilgad
fuente
fuente
Respuestas:
Usaría este procedimiento almacenado para generar los intervalos que necesita en la tabla temporal llamada time_intervals , luego UNIRSE y agregar su tabla de datos con la tabla temporal time_intervals .
El procedimiento puede generar intervalos de todos los tipos diferentes que ve especificados en él:
Escenario de datos de ejemplo similar al final de esta publicación , donde construí una función similar para SQL Server.
fuente
Para MSSQL, puede usar esto. Es MUY rápido.
Puede resumir esto en una función con valores de tabla o un proceso almacenado y analizar las fechas de inicio y finalización como variables.
fuente
Tuvimos un problema similar con los informes BIRT en el sentido de que queríamos informar sobre aquellos días que no tenían datos. Como no había entradas para esas fechas, la solución más fácil para nosotros fue crear una tabla simple que almacenara todas las fechas y usarla para obtener rangos o unirse para obtener valores cero para esa fecha.
Tenemos un trabajo que se ejecuta todos los meses para garantizar que la tabla se llene dentro de cinco años. La tabla se crea así:
Sin duda, hay formas mágicas y complicadas de hacer esto con diferentes DBMS, pero siempre optamos por la solución más simple. Los requisitos de almacenamiento de la tabla son mínimos y hace que las consultas sean mucho más sencillas y portátiles. Este tipo de solución es casi siempre mejor desde el punto de vista del rendimiento, ya que no requiere cálculos por fila de los datos.
La otra opción (y la hemos usado antes) es asegurarnos de que haya una entrada en la tabla para cada fecha. Barrimos la tabla periódicamente y agregamos cero entradas para fechas y / o horas que no existían. Esto puede no ser una opción en su caso, depende de los datos almacenados.
Si realmente cree que es una molestia mantener la
all_dates
tabla llena, un procedimiento almacenado es el camino a seguir que devolverá un conjunto de datos que contiene esas fechas. Es casi seguro que esto será más lento, ya que debe calcular el rango cada vez que se llama en lugar de simplemente extraer datos precalculados de una tabla.Pero, para ser honesto, podría completar la tabla durante 1000 años sin ningún problema grave de almacenamiento de datos: 365,000 fechas de 16 bytes (por ejemplo) más un índice que duplica la fecha más un 20% de sobrecarga por seguridad, estimaría aproximadamente en aproximadamente 14M [365,000 * 16 * 2 * 1.2 = 14,016,000 bytes]), una tabla minúscula en el esquema de las cosas.
fuente
Puede usar las variables de usuario de MySQL de esta manera:
@num es -1 porque lo agrega la primera vez que lo usa. Además, no puede usar "HAVING date_sequence" porque eso hace que la variable de usuario se incremente dos veces para cada fila.
fuente
Tomando prestada una idea de esta respuesta, puede configurar una tabla con 0 a 9 y usarla para generar su lista de fechas.
Esto le permitirá generar una lista de hasta 1000 fechas. Si necesita agrandar, puede agregar otra combinación cruzada a la consulta interna.
fuente
date
; NO da como resultado esa parte.Para Access (o cualquier lenguaje SQL)
Cree una tabla que tenga 2 campos, llamaremos a esta tabla
tempRunDates
:--Campos
fromDate
y -toDate
Luego inserte solo 1 registro, que tenga la fecha de inicio y la fecha de finalización.
Cree otra tabla:
Time_Day_Ref
--Importe una lista de fechas (hacer una lista en Excel es fácil) en esta tabla.
--El nombre del campo en mi caso es
Greg_Dt
, para Gregoriano Fecha--Hice mi lista desde el 1 de enero de 2009 hasta el 1 de enero de 2020.
Ejecute la consulta:
¡Fácil!
fuente
Por lo general, se usaría una tabla de números auxiliares que generalmente mantiene para este propósito con alguna variación en esto:
He visto variaciones con funciones con valores de tabla, etc.
También puede mantener una lista permanente de fechas. Tenemos eso en nuestro almacén de datos, así como una lista de horas del día.
fuente
Bueno, cómo encontrar fechas entre dos fechas determinadas en el servidor SQL se explica en http://ektaraval.blogspot.com/2010/09/writing-recursive-query-to-find-out-all.html
fuente
fuente
Solución elegante que utiliza la nueva funcionalidad recursiva (Expresiones de tabla comunes) en MariaDB> = 10.3 y MySQL> = 8.0.
Lo anterior devuelve una tabla de fechas entre '2019-01-01' y '2019-04-30'.
fuente
Usamos esto en nuestro sistema HRMS, lo encontrará útil
fuente
Esta solución está trabajando con MySQL 5.0
Crear una tabla -
mytable
.El esquema no es material. Lo que importa es el número de filas que contiene.
Por lo tanto, puede mantener solo una columna de tipo INT con 10 filas, valores: 1 a 10.
SQL:
Limitación: el número máximo de fechas devueltas por la consulta anterior será
(rows in mytable)*(rows in mytable) = 10*10 = 100.
Puede aumentar este rango cambiando la forma parte en sql:
de mytable x, mytable y, mytable z
Entonces, el rango be
10*10*10 =1000
y así sucesivamente.fuente
Cree un procedimiento almacenado que tome dos parámetros a_begin y a_end. Cree una tabla temporal dentro de ella llamada t, declare una variable d, asigne a_begin ad, y ejecute un
WHILE
bucleINSERT
d en t y llame a laADDDATE
función para incrementar el valor d. FinalmenteSELECT * FROM t
.fuente
Usaría algo similar a esto:
Luego, la
@HOLDER
tabla Variable contiene todas las fechas incrementadas por día entre esas dos fechas, listas para unirse al contenido de su corazón.fuente
He estado luchando con esto durante bastante tiempo. Dado que este es el primer resultado en Google cuando busqué la solución, permítanme publicar dónde he llegado hasta ahora.
Reemplace
[yourTable]
con una tabla de su base de datos. El truco es que la cantidad de filas en la tabla que seleccione debe ser> = la cantidad de fechas que desea que se devuelvan. Intenté usar el marcador de posición de la tabla DUAL, pero solo devolvería una sola fila.fuente
Aquí, primero agregue un día a la fecha de finalización actual, será 2011-02-28 00:00:00, luego resta un segundo para hacer la fecha de finalización 2011-02-27 23:59:59. Al hacer esto, puede obtener todas las fechas entre los intervalos dados.
salida:
2011/02/25
2011/02/26
2011/02/27
fuente
Este procedimiento insertará todas las fechas desde el comienzo del año hasta ahora, simplemente sustituya los días de "inicio" y "fin", ¡y estará listo para comenzar!
fuente
IF a=365 THEN
ve afectada la línea por los años bisiestos?150
de la línea 9? Este código es una "respuesta sencilla" sin mucha explicación real.Necesitaba una lista con todos los meses entre 2 fechas para estadísticas. Las 2 fechas son la fecha de inicio y finalización de una suscripción. Entonces, la lista muestra todos los meses y la cantidad de suscripciones por mes.
MYSQL
fuente
Puedes usar esto
fuente
estoy usando
Server version: 5.7.11-log MySQL Community Server (GPL)
Ahora resolveremos esto de una manera sencilla.
He creado una tabla llamada "datetable"
ahora, veremos los registros insertados dentro.
y aquí nuestra consulta para obtener registros dentro de dos fechas en lugar de esas fechas.
Espero que esto ayude a muchos.
fuente