Consulta SQL para selecionar datas entre duas datas

Eu tenho um start_date e end_date . Eu quero pegar a lista de datas entre essas duas datas. Alguém pode me ajudar apontando o erro na minha consulta.

 select Date,TotalAllowance from Calculation where EmployeeId=1 and Date between 2011/02/25 and 2011/02/27 

Aqui Date é uma variável datetime .

você deve colocar essas duas datas entre aspas simples como ..

 select Date, TotalAllowance from Calculation where EmployeeId = 1 and Date between '2011/02/25' and '2011/02/27' 

ou pode usar

 select Date, TotalAllowance from Calculation where EmployeeId = 1 and Date >= '2011/02/25' and Date <= '2011/02/27' 

Como um datetime sem um segmento de tempo especificado terá um valor de date 00:00:00.000 , se você quiser ter certeza de obter todas as datas em seu intervalo, deverá fornecer o horário para sua data final ou aumentar sua data final. e use < .

 select Date,TotalAllowance from Calculation where EmployeeId=1 and Date between '2011/02/25' and '2011/02/27 23:59:59.999' 

OU

 select Date,TotalAllowance from Calculation where EmployeeId=1 and Date >= '2011/02/25' and Date < '2011/02/28' 

OU

 select Date,TotalAllowance from Calculation where EmployeeId=1 and Date >= '2011/02/25' and Date <= '2011/02/27 23:59:59.999' 

NÃO use o seguinte, pois ele pode retornar alguns registros a partir de 2011/02/28 se o horário for 00: 00: 00.000.

 select Date,TotalAllowance from Calculation where EmployeeId=1 and Date between '2011/02/25' and '2011/02/28' 

Tente isto:

 select Date,TotalAllowance from Calculation where EmployeeId=1 and [Date] between '2011/02/25' and '2011/02/27' 

Os valores de data precisam ser typescripts como strings.

Para garantir uma consulta futura do SQL Server 2008 e posterior, Date deve ter escape porque é uma palavra reservada em versões posteriores.

Lembre-se de que as datas sem horários tomam a meia-noite como padrão, portanto talvez você não tenha o valor correto.

 select * from table_name where col_Date between '2011/02/25' AND DATEADD(s,-1,DATEADD(d,1,'2011/02/27')) 

Aqui, primeiro adicione um dia ao endDate atual, será 2011-02-28 00:00:00 , então você subtrai um segundo para fazer a data final 2011-02-27 23:59:59 . Ao fazer isso, você pode obter todas as datas entre os intervalos fornecidos.

 output: 2011/02/25 2011/02/26 2011/02/27 

Esta consulta é válida para buscar os valores entre a data atual e as próximas 3 datas

 SELECT * FROM tableName WHERE columName BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY) 

Isso acabará adicionando 3 dias extras de buffer à data atual.

 select * from test where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4' 

– se o tipo de dados for diferente

Isso é muito antigo, mas, considerando muitas experiências com datas, convém considerar isso: as pessoas usam diferentes configurações regionais, portanto, algumas pessoas (e alguns bancos de dados / computadores, dependendo das configurações regionais) podem ler este item. data 11/12/2016 em 11 de dezembro de 2016 ou 12 de novembro de 2016. Ainda mais, 16/11/12 fornecido para database MySQL será convertido internamente em 12 de novembro de 2016, enquanto o database Access em execução em um computador de configuração regional do Reino Unido interpretará e guarde-o a 16 de novembro de 2012.

Por isso, fiz com que minha política fosse explícita sempre que eu fosse interagir com datas e bancos de dados. Por isso, sempre forneço minhas consultas e códigos de programação da seguinte maneira:

 SELECT FirstName FROM Students WHERE DoB >= '11 Dec 2016'; 

Note também que o Access aceitará o #, assim:

 SELECT FirstName FROM Students WHERE DoB >= #11 Dec 2016#; 

mas MS SQL Server não, então eu sempre uso “‘” como acima, que ambos os bancos de dados aceitam.

E ao obter essa data de uma variável no código, sempre converto o resultado em string da seguinte maneira:

 "SELECT FirstName FROM Students WHERE DoB >= " & myDate.ToString("d MMM yyyy") 

Estou escrevendo isso porque sei que algumas vezes alguns programadores podem não estar suficientemente interessados ​​em detectar a conversão inerente. Não haverá erro para datas <13, apenas resultados diferentes!

Quanto à pergunta, adicione um dia à última data e faça a comparação da seguinte forma:

 dated >= '11 Nov 2016' AND dated < '15 Nov 2016' 
 select Date,TotalAllowance from Calculation where EmployeeId=1 and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27' 

Tente colocar as datas entre # # por exemplo:

 #2013/4/4# and #2013/4/20# 

Isso funcionou para mim.

— EDIT — Recebi uma notificação de que perdi dois pontos de reputação porque alguém rejeitou esta resposta. Por favor, não basta votar se a resposta não funcionar para você. Peça mais informações / ajuda nos comentários ou confira outras soluções.

Eu não me importo com pontos de reputação – eu apenas digo que votos negativos não são feitos para isso.

melhor consulta para a data selecionada entre a data atual e a parte traseira três dias :

  select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN DATE_SUB(CURDATE(), INTERVAL 3 DAY) AND CURDATE() 

melhor consulta para a data selecionada entre a data atual e os próximos três dias :

  select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY) 

Se a data em 24 horas e começar de manhã e terminar a noite deve adicionar algo como:

 declare @Approval_date datetime set @Approval_date =getdate() Approval_date between @Approval_date +' 00:00:00.000' and @Approval_date +' 23:59:59.999' 

Confira abaixo os exemplos: trabalhando e não trabalhando.

 select * from tblUser Where convert(varchar(10),CreatedDate,111) between '2015/04/01' and '2016/04/01' //--**Working** 

OU

 select * from tblUser Where (CAST(CreatedDate AS DATETIME) between CAST('2015/04/01' AS DATETIME) And CAST('2016/4/30'AS DATETIME)) //--**Working** 

OU

 select * from tblUser Where (YEAR(CreatedDate) between YEAR('2015/04/01') And YEAR('2016/4/30')) //--**Working** 

E abaixo não está funcionando:

 select * from tblUser Where Convert(Varchar(10),CreatedDate,111) >= Convert(Varchar(10),'01-01-2015',111) and Convert(Varchar(10),CreatedDate,111) <= Convert(Varchar(10),'31-12-2015',111) //--**Not Working** select * from tblUser Where (Convert(Varchar(10),CreatedDate,111) between Convert(Varchar(10),'01-01-2015',111) And Convert(Varchar(10),'31-12-2015',111)) //--**Not Working** 
 Select * from Calculation where EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#; 

podemos usar entre para mostrar dois dados de datas, mas isso irá pesquisar os dados completos e comparar, o que tornará nosso processo lento para dados enormes, então eu sugiro que todos usem o datediff :

 qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 " 

aqui o calendar é a Tabela, dt como variável de data de início e dt2 é a variável de data de conclusão.

Eu gosto de usar a syntax ‘1 MonthName 2015’ para datas ex:

  WHERE aa.AuditDate>='1 September 2015' AND aa.AuditDate<='30 September 2015' 

para datas

Eu iria para

 select Date,TotalAllowance from Calculation where EmployeeId=1 and Date >= '2011/02/25' and Date < DATEADD(d, 1, '2011/02/27') 

A lógica é que >= inclui toda a data de início e < exclui a data final, então adicionamos uma unidade à data final. Isso pode ser adaptado por meses, por exemplo:

 select Date, ... from ... where Date >= $start_month_day_1 and Date < DATEADD(m, 1, $end_month_day_1) 

Você pode tentar este SQL

 select * from employee where rec_date between '2017-09-01' and '2017-09-11' 

é melhor escrever assim:

 CREATE PROCEDURE dbo.Get_Data_By_Dates ( @EmployeeId INT = 1, @Start_Date DATE, @End_Date Date ) AS Select * FROM Calculation where EmployeeId=@EmployeeId AND Test_Date BETWEEN @Start_Date AND @End_Date RETURN 
 SELECT Date, TotalAllowance FROM Calculation WHERE EmployeeId = 1 AND Date BETWEEN to_date('2011/02/25','yyyy-mm-dd') AND to_date ('2011/02/27','yyyy-mm-dd');