Selecione os dados do intervalo de datas entre duas datas

100

Eu tenho uma tabela chamada Product_Salese ela contém dados como este

Product_ID | Sold_by | Qty | From_date  | To_date
-----------+---------+-----+------------+-----------
3          | 12      | 7   | 2013-01-05 | 2013-01-07
6          | 22      | 14  | 2013-01-06 | 2013-01-10
8          | 11      | 9   | 2013-02-05 | 2013-02-11

Agora, qual é a consulta se eu quiser selecionar dados de vendas entre duas datas de um intervalo de datas?

Por exemplo, desejo selecionar dados de vendas de 2013-01-03a 2013-01-09.

Ronjon
fonte
To_date> 03/01/2013 E From_date <09/01/2013. ?
jpulikkottil

Respostas:

144

descrição da interseção do intervalo

Como você pode ver, existem duas maneiras de fazer as coisas:

  • alistar todas as opções aceitáveis
  • excluir todas as opções erradas

Obviamente, a segunda maneira é muito mais simples (apenas dois casos contra quatro).

Seu SQL será semelhante a:

SELECT * FROM Product_sales 
WHERE NOT (From_date > @RangeTill OR To_date < @RangeFrom)
Dmitry Lukichev
fonte
13
Só quero dizer que adoro que você tenha desenhado isso em um quadro branco para explicar a resposta. Você tem meu respeito e minha admiração.
Ben Bynum
3
Eu sei que esse problema é muito antigo, mas se você não quiser ou não puder usar essa WHERE NOTcondição, virar os operadores e adicionar um igual também está fazendo o trabalho: SELECT * FROM Product_sales WHERE From_date <= @RangeTill OR To_date >= @RangeFrom
Laurenz Glück
84
SELECT * from Product_sales where
(From_date BETWEEN '2013-01-03'AND '2013-01-09') OR 
(To_date BETWEEN '2013-01-03' AND '2013-01-09') OR 
(From_date <= '2013-01-03' AND To_date >= '2013-01-09')

Você tem que cobrir todas as possibilidades. From_Date ou To_Date pode estar entre o seu intervalo de datas ou as datas de registro podem abranger todo o intervalo.

Se um de From_dateou To_dateestiver entre as datas, ou From_datefor menor que a data de início e To_datefor maior que a data de término; então esta linha deve ser retornada.

Anjo caído
fonte
Resposta da página (Y)
GreenROBO
Como retornar todos os dados se a data de entrada for nula ou vazia? e também, se uma das datas for nula ou vazia, o resultado deve ser obtido com base
nesses
40

Tente a seguinte consulta para obter datas entre o intervalo:

SELECT  *
FROM    Product_sales 
WHERE   From_date >= '2013-01-03' AND
        To_date   <= '2013-01-09'
jkmurphy1
fonte
8
Isso não cobre todas as possibilidades!
FallenAngel
@FallenAngel, você pode me explicar quais não estão cobertos?
Babblo
4
Verifique minha resposta , por favor, você não cobriu as vendas que começaram antes, start_datemas terminaram entre start_datee end_date. Por outro lado, a questão não é clara o suficiente, eu acho, não temos ideia se devemos pegar vendas que estão estritamente entre datas dadas ou datas que incluem parcialmente o intervalo de datas, mas podem se estender de um lado ou do outro ou ambos? Então, o problema básico é que a questão não está clara, eu acho.
FallenAngel de
Sei que este post é antigo mas para quem está lendo: Este não é entre datas mas inclui as datas. De e Para.
Ken
23
SELECT * FROM Product_sales 
WHERE From_date between '2013-01-03'
AND '2013-01-09'
Berkay Turancı
fonte
Sua seleção estará errada para o exemplo From_date: 2012-12-30 to To_Date: 2013-01-05. Essas datas estão dentro do intervalo desejado, mas em seu SQL não serão retornadas porque começam antes do intervalo, mas terminam dentro do intervalo.
NetVicious de
5

Isso cobre todas as condições que você procura.

SELECT * from Product_sales where (From_date <= '2013-01-09' AND To_date >= '2013-01-01')
Avinash
fonte
4
SELECT *
FROM Product_sales
WHERE (
From_date >= '2013-08-19'
AND To_date <= '2013-08-23'
)
OR (
To_date >= '2013-08-19'
AND From_date <= '2013-08-23'
)
Kiran K
fonte
1
Para interseção inclusiva, você desejará adicionar mais uma cláusula OR para capturar quando from_date for anterior ao início e to_date for posterior ao final: OR (To_date <= '2013-08-19' AND From_date> = '2013-08- 23 ')
jhorback de
3

Tente por favor:

DECLARE @FrmDt DATETIME, @ToDt DATETIME
SELECT @FrmDt='2013-01-03', @ToDt='2013-01-09'

SELECT * 
FROM Product_sales 
WHERE (@FrmDt BETWEEN From_date AND To_date) OR 
    (@ToDt BETWEEN From_date AND To_date)
TechDo
fonte
3

Apenas meus 2 centavos, acho que usar o formato "dd-MMM-aaaa" é mais seguro, pois o servidor db saberá o que você deseja, independentemente das configurações regionais no servidor. Caso contrário, você pode ter problemas em um servidor que tem suas configurações regionais de data como aaaa-dd-mm (por qualquer motivo)

Portanto:

SELECT * FROM Product_sales 
WHERE From_date >= '03-Jan-2013'
AND To_date <= '09-Jan-2013'

Sempre funcionou bem para mim ;-)

KDT
fonte
3

Isso está funcionando em SQL_Server_2008 R2

Select * 
from Product_sales
where From_date 
between '2013-01-03' and '2013-01-09'
I_Valchev
fonte
3
select * 
from table 
where
( (table.EndDate > '2013-01-05') and (table.StartDate < '2013-01-07' )  )
Gestef
fonte
2

Esta consulta irá ajudá-lo a:

select * 
from XXXX
where datepart(YYYY,create_date)>=2013 
and DATEPART(YYYY,create_date)<=2014
Ritesh Yadav
fonte
1
SELECT NULL  
    FROM   HRMTable hm(NOLOCK)  
    WHERE  hm.EmployeeID = 123
        AND (  
                (  
                    CAST(@Fromdate AS date) BETWEEN CAST(hm.FromDate AS date)  
                        AND CAST(hm.ToDate AS date)  
                )  
                OR (  
                    CAST(@Todate AS date) BETWEEN CAST(hm.FromDate AS date)  
                        AND CAST(hm.ToDate AS date)  
                   )  
                ) 
         )
Zafarsiddiqui
fonte
1

Verifique esta consulta, criei esta consulta para verificar se a data de check-in coincide com alguma data de reserva

SELECT * FROM tbl_ReservedRooms
WHERE NOT ('@checkindate' NOT BETWEEN fromdate AND todate
  AND '@checkoutdate'  NOT BETWEEN fromdate AND todate)

isso irá executar novamente os detalhes que estão sobrepostos, para obter os detalhes que não se sobrepõem e, em seguida, remover o 'NÃO' da consulta

anandd360
fonte
1

Você também pode tentar usar os seguintes fragmentos:

select  * from  Product_sales 
where  From_date  >= '2013-01-03' and game_date  <= '2013-01-09'
erupções cutâneas
fonte
1

Isso é fácil, use esta consulta para encontrar dados selecionados do intervalo de datas entre duas datas

select * from tabblename WHERE (datecolumn BETWEEN '2018-04-01' AND '2018-04-5')
F5 Buddy
fonte
0

Você deve comparar datas em sql da mesma forma que compara valores numéricos,

SELECT * FROM Product_sales
WHERE From_date >= '2013-01-01' AND To_date <= '2013-01-20'
Adeel ahmed
fonte
0

Aqui está uma consulta para encontrar todas as vendas de produtos que ocorreram durante o mês de agosto

  • Encontre Product_sales que estiveram ativos durante o mês de agosto
  • Inclui tudo o que começou antes do final de agosto
  • Exclua tudo o que terminou antes de 1º de agosto

Também adiciona uma declaração de caso para validar a consulta

SELECT start_date, 
       end_date, 
       CASE 
         WHEN start_date <= '2015-08-31' THEN 'true' 
         ELSE 'false' 
       END AS started_before_end_of_month, 
       CASE 
         WHEN NOT end_date <= '2015-08-01' THEN 'true' 
         ELSE 'false' 
       END AS did_not_end_before_begining_of_month 
FROM   product_sales 
WHERE  start_date <= '2015-08-31' 
       AND end_date >= '2015-08-01' 
ORDER  BY start_date; 
jspooner
fonte
0
DECLARE @monthfrom int=null,
@yearfrom int=null,
@monthto int=null,
@yearto int=null,
@firstdate DATE=null,
@lastdate DATE=null

SELECT @firstdate=DATEADD(month,@monthfrom-1,DATEADD(year,@yearfrom-1900,0)) /*Setting First Date using From Month & Year*/
SELECT @lastdate= DATEADD(day,-1,DATEADD(month,@monthto,DATEADD(year,@yearto-1900,0)))/*Setting Last Date using From Month & Year*/

SELECT *  FROM tbl_Record
WHERE  (DATEADD(yy, Year - 1900, DATEADD(m, Month - 1, 1 - 1)) BETWEEN CONVERT(DATETIME, @firstdate, 102) AND 
CONVERT(DATETIME, @lastdate, 102))
Código
fonte
-1

isso é fácil, use esta consulta para encontrar o que deseja.

select * from Product_Sales where From_date<='2018-04-11' and To_date>='2018-04-11'
Abdirazack
fonte