Pesquisa SQL para seleccionar datas entre duas datas

Eu tenho um start_date e end_date. Quero a lista de datas entre estas duas datas. Alguém me pode ajudar a apontar o erro na minha pergunta?

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

aqui Date é uma variável datetime.

Author: shA.t, 2011-02-26

19 answers

Devias pôr essas duas datas entre aspas..
select Date, TotalAllowance from Calculation where EmployeeId = 1
             and Date between '2011/02/25' and '2011/02/27'

Ou pode utilizar

select Date, TotalAllowance from Calculation where EmployeeId = 1
             and Date >= '2011/02/25' and Date <= '2011/02/27'
 361
Author: Deepak, 2014-07-30 20:17:55

Uma vez que uma data sem um segmento de tempo especificado terá um valor de date 00:00:00.000, Se quiser ter a certeza de obter todas as datas no seu intervalo, deverá indicar a hora para a sua data final ou aumentar a sua data final e usar <.

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 utilize o seguinte, uma vez que poderá devolver alguns registos a partir de 2011/02/28 se os seus horários forem 00:00:00.000.

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date between '2011/02/25' and '2011/02/28'
 100
Author: WelshDragon, 2014-02-27 22:43:13

Tenta isto:

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

Os valores das datas têm de ser dactilografados como strings.

Para garantir a revisão futura da sua consulta para o servidor SQL 2008 e superior, Date deve ser escapada porque é uma palavra reservada em versões posteriores.

Tenha em mente que as datas sem horários levam meia-noite como seus defaults, de modo que você pode não ter o valor correto lá.

 12
Author: , 2011-02-26 16:43:09
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 à data final actual, será {[[2]}, Depois 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 indicados.

output:
2011/02/25
2011/02/26
2011/02/27
 9
Author: Chandra Prakash, 2015-09-21 09:30:20

Esta pesquisa é boa para obter os valores entre a data actual e as suas próximas 3 datas

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

Isto irá eventualmente adicionar mais 3 dias de buffer à data actual.

 6
Author: Vinit Kadkol, 2013-05-01 15:45:52
select * from test 
     where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'

-- se o tipo de dados for diferente

 5
Author: hamze shoae, 2013-04-05 07:10:56

Esta é muito velha, mas com um monte de experiências que eu tive com datas, você pode querer considerar esta: as Pessoas usam diferentes configurações regionais, como tal, algumas pessoas (e algumas bases de dados/computadores, dependendo de definições regionais) pode ler esta data 11/12/2016 como 11 de Dezembro de 2016, ou Nov 12, de 2016. Ainda mais, 16/11/12 fornecido à base de dados MySQL será convertido internamente para 12 de Novembro de 2016, enquanto o banco de dados Access rodando em um computador Regional do Reino Unido irá interpretá-lo e armazená-lo como 16 Nov 2012.

Por isso, fiz da minha Política ser explícita sempre que vou interagir com datas e bases de dados. Então eu sempre forneço minhas consultas e códigos de programação da seguinte forma:
SELECT FirstName FROM Students WHERE DoB >= '11 Dec 2016';

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

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

Mas o servidor de MS SQL não o fará, por isso Uso sempre "'" como acima, que ambas as bases de dados aceitam.

E ao obter essa data a partir de uma variável em código, converto sempre o resultado para a cadeia de caracteres da seguinte forma:

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

Eu sou escrevendo isso porque eu sei que algumas vezes alguns programadores podem não estar suficientemente interessados para detectar a conversão inerente. Não haverá erro para datas Quanto à questão colocada, adicione um dia à última data e faça a comparação do seguinte modo:

dated >= '11 Nov 2016' AND dated < '15 Nov 2016' 
 4
Author: Hannington Mambo, 2016-11-22 05:44:36
select Date,TotalAllowance 
from Calculation 
where EmployeeId=1
  and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27'
 3
Author: njtd, 2017-09-10 06:31:47
Tente colocar as datas entre # # por exemplo:
#2013/4/4# and #2013/4/20#
Funcionou comigo.

- - - editar --- Recebi uma notificação de que perdi dois pontos de reputação porque alguém rejeitou esta resposta. Por favor, não votem em baixo se a resposta não resultar. Peça mais informações/ajuda nos comentários, ou verifique outras soluções.

Não quero saber de pontos de reputação - Só digo que não há votos negativos para isso.
 3
Author: Casper, 2018-02-15 23:41:30

A melhor pesquisa para a data de selecção entre a data actual e recuar três dias:

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

A melhor pesquisa para a data de selecção entre a data actual 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)   
 2
Author: user3223432, 2014-07-17 08:41:34

Se a data for em 24 horas e começar de manhã e terminar à noite deve adicionar algo do género:

declare @Approval_date datetime
set @Approval_date =getdate()
Approval_date between @Approval_date +' 00:00:00.000' and @Approval_date +' 23:59:59.999'
 1
Author: Sheryar Nizar, 2014-03-25 08:39:04

Veja abaixo os exemplos: trabalho e não-trabalho.

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 funciona:

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**
 1
Author: Tobbin Well, 2016-06-17 16:58:36
Select 
    * 
from 
    Calculation 
where 
    EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#;
 1
Author: Saad Sheikh, 2017-09-10 06:33:35
Podemos usar entre duas datas para mostrar dados, mas isto irá pesquisar todos os dados e comparar para tornar o nosso processo lento para dados enormes, por isso sugiro que todos usem datediff:
qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 "

Aqui o calendário é a Tabela, dt como a variável de data inicial e dt2 como a variável de data final.

 1
Author: Bipul Roy, 2017-12-04 05:36:37

Gosto de usar a sintaxe '1 MonthName 2015' para as datas ex:

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

Para datas

 0
Author: Juan, 2015-10-02 08:49:12
Eu escolheria ...
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 de fim, por isso adicionamos uma unidade à data de fim. Isto 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)
 0
Author: entonio, 2016-11-15 00:04:40

Podes tentar este SQL

select * from employee where rec_date between '2017-09-01' and '2017-09-11' 
 0
Author: Kamran, 2017-09-11 09:41:33
É 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
 -1
Author: Hadi, 2017-04-12 16:05:02
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');
 -7
Author: Ankita, 2013-09-17 12:09:57