Usando funções padrão do mysql, existe uma maneira de escrever uma consulta que retornará uma lista de dias entre duas datas.
por exemplo, dado 01-01-2009 e 13/01/2009, ele retornaria uma tabela de uma coluna com os 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
Edit: Parece que não fui claro. Eu quero GERAR esta lista. Tenho valores armazenados no banco de dados (por data e hora), mas quero que eles sejam agregados em uma junção externa esquerda a uma lista de datas como acima (estou esperando nulo do lado direito de algumas dessas junções por alguns dias e vou cuidar disso )
mysql
sql
date
gaps-and-islands
Gilgad
fonte
fonte
Respostas:
Eu usaria esse procedimento armazenado para gerar os intervalos de que você precisa na tabela temporária chamada time_intervals , então JOIN e agregar sua tabela de dados com a tabela temporária time_intervals .
O procedimento pode gerar intervalos de todos os diferentes tipos que você vê especificados nele:
Cenário de dados de exemplo semelhante na parte inferior desta postagem , em que construí uma função semelhante para o SQL Server.
fonte
Para MSSQL, você pode usar isso. É MUITO rápido.
Você pode resumir isso em uma função com valor de tabela ou proc armazenado e analisar as datas de início e término como variáveis.
fonte
Tivemos um problema semelhante com os relatórios do BIRT, pois queríamos relatar os dias que não tinham dados. Como não havia entradas para essas datas, a solução mais fácil para nós foi criar uma tabela simples que armazenasse todas as datas e usá-la para obter intervalos ou junção para obter valores zero para essa data.
Temos um trabalho que é executado todos os meses para garantir que a tabela seja preenchida em 5 anos no futuro. A tabela é criada assim:
Sem dúvida, existem maneiras mágicas e complicadas de fazer isso com diferentes SGBDs, mas sempre optamos pela solução mais simples. Os requisitos de armazenamento da tabela são mínimos e isso torna as consultas muito mais simples e portáteis. Esse tipo de solução quase sempre é melhor do ponto de vista do desempenho, pois não requer cálculos por linha nos dados.
A outra opção (e já usamos isso antes) é garantir que haja uma entrada na tabela para cada data. Nós varremos a tabela periodicamente e adicionamos zero entradas para datas e / ou horas que não existiam. Isso pode não ser uma opção no seu caso, depende dos dados armazenados.
Se você realmente acha que é um incômodo manter o
all_dates
tabela preenchida, um procedimento armazenado é o caminho a seguir, que retornará um conjunto de dados contendo essas datas. Isso quase certamente será mais lento, pois você terá que calcular o intervalo toda vez que for chamado, em vez de apenas extrair dados pré-calculados de uma tabela.Mas, para ser honesto, você poderia preencher a tabela por 1000 anos sem problemas sérios de armazenamento de dados - 365.000 datas de 16 bytes (por exemplo) mais um índice que duplica a data mais 20% de sobrecarga para segurança, eu estimaria aproximadamente em cerca de 14M [365.000 * 16 * 2 * 1,2 = 14.016.000 bytes]), uma tabela minúscula no esquema das coisas.
fonte
Você pode usar as variáveis de usuário do MySQL assim:
@num é -1 porque você adiciona a ele na primeira vez que o usa. Além disso, você não pode usar "HAVING date_sequence" porque isso faz com que a variável do usuário seja incrementada duas vezes para cada linha.
fonte
Tirando uma ideia dessa resposta, você pode configurar uma tabela de 0 a 9 e usá-la para gerar sua lista de datas.
Isso permitirá que você gere uma lista de até 1000 datas. Se precisar aumentar, você pode adicionar outra junção cruzada à consulta interna.
fonte
date
; NÃO resulta nessa parte.Para Access (ou qualquer linguagem SQL)
Crie uma tabela que tenha 2 campos, chamaremos esta tabela
tempRunDates
:--Campos
fromDate
e - EmtoDate
seguida, insira apenas 1 registro, que tem a data de início e a data de término.
Crie outra tabela:
Time_Day_Ref
--Importe uma lista de datas (fazer lista no excel é fácil) para esta tabela.
--O nome do campo no meu caso é
Greg_Dt
, para data gregoriana--fiz minha lista de 1 ° de janeiro de 2009 a 1 ° de janeiro de 2020.
Execute a consulta:
Fácil!
fonte
Normalmente, alguém usaria uma tabela auxiliar de números que você normalmente mantém apenas para este propósito, com algumas variações sobre isto:
Já vi variações com funções com valor de tabela, etc.
Você também pode manter uma lista permanente de datas. Temos isso em nosso data warehouse, bem como uma lista de horários do dia.
fonte
Bem, como encontrar datas entre duas datas fornecidas no servidor SQL é explicado em http://ektaraval.blogspot.com/2010/09/writing-recursive-query-to-find-out-all.html
fonte
fonte
Solução elegante usando a nova funcionalidade recursiva (Common Table Expressions) em MariaDB> = 10.3 e MySQL> = 8.0.
O texto acima retorna uma tabela de datas entre '01/01/2019' e '30/04/2019'.
fonte
Usamos isso em nosso sistema HRMS, você vai achar útil
fonte
Esta solução está funcionando com MySQL 5.0
Criar uma tabela -
mytable
.O esquema não é material. O que importa é o número de linhas nele.
Portanto, você pode manter apenas uma coluna do tipo INT com 10 linhas, valores - 1 a 10.
SQL:
Limitação: O número máximo de datas retornadas pela consulta acima será
(rows in mytable)*(rows in mytable) = 10*10 = 100.
Você pode aumentar este intervalo alterando a parte do formulário em sql:
from mytable x, mytable y, mytable z
Então, o intervalo be
10*10*10 =1000
e assim por diante.fonte
Crie um procedimento armazenado que receba dois parâmetros a_begin e a_end. Crie uma tabela temporária dentro dela chamada t, declare uma variável d, atribua a_begin a d e execute um
WHILE
loopingINSERT
d em t e chame aADDDATE
função para incrementar o valor d. FinalmenteSELECT * FROM t
.fonte
Eu usaria algo semelhante a este:
Em seguida, a
@HOLDER
tabela Variável contém todas as datas incrementadas por dia entre essas duas datas, prontas para serem unidas quando quiser.fonte
Eu tenho lutado com isso há um bom tempo. Já que este é o primeiro hit no Google quando busquei a solução, deixe-me postar onde cheguei até agora.
Substitua
[yourTable]
por uma tabela de seu banco de dados. O truque é que o número de linhas na tabela que você seleciona deve ser> = o número de datas que você deseja retornar. Tentei usar o marcador de posição DUAL da tabela, mas ele retornaria apenas uma única linha.fonte
Aqui, primeiro adicione um dia à data final atual, será 2011-02-28 00:00:00, então você subtrairá um segundo para definir a data final 2011-02-27 23:59:59. Ao fazer isso, você pode obter todas as datas entre os intervalos fornecidos.
saída:
2011/02/25
2011/02/26
2011/02/27
fonte
este procedimento irá inserir todas as datas desde o início do ano até agora, apenas substitua os dias de "início" e "fim" e está pronto para começar!
fonte
IF a=365 THEN
afetada por anos bissextos?150
na linha 9? Este código é uma "resposta padrão" sem muita explicação real.Eu precisava de uma lista com todos os meses entre 2 datas para estatísticas. As 2 datas são a data de início e de término de uma assinatura. Assim, a lista mostra todos os meses e a quantidade de assinaturas por mês.
MYSQL
fonte
Você pode usar isso
fonte
estou usando
Server version: 5.7.11-log MySQL Community Server (GPL)
Agora vamos resolver isso de uma maneira simples.
Eu criei uma tabela chamada "datetable"
agora, veremos os registros inseridos dentro.
e aqui nossa consulta para buscar registros dentro de duas datas em vez dessas datas.
espero que isso ajude muitos.
fonte