Seleziona i dati dall'intervallo di date tra due date


100

Ho una tabella denominata Product_Salese contiene dati come questo

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

Qual è la query se desidero selezionare i dati di vendita tra due date da un intervallo di date?

Ad esempio, desidero selezionare i dati di vendita da 2013-01-03a 2013-01-09.


To_date> 2013-01-03 E From_date <2013-01-09. ?
jpulikkottil

Risposte:


144

descrizione dell'intersezione dell'intervallo

Come puoi vedere, ci sono due modi per fare le cose:

  • arruolare tutte le opzioni accettabili
  • escludere tutte le opzioni sbagliate

Ovviamente la seconda via è molto più semplice (solo due casi contro quattro).

Il tuo SQL sarà simile a:

SELECT * FROM Product_sales 
WHERE NOT (From_date > @RangeTill OR To_date < @RangeFrom)

13
Voglio solo dire che mi piace che tu l'abbia disegnato su una lavagna bianca per spiegare la risposta. Hai il mio rispetto e la mia ammirazione.
Ben Bynum

3
So che questo problema è piuttosto vecchio, ma se non vuoi o non puoi usare questa WHERE NOTcondizione, girare intorno agli operatori e aggiungere un pari fa anche il lavoro: 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')

Devi coprire tutte le possibilità. From_Date o To_Date potrebbero essere comprese tra l'intervallo di date oppure le date di registrazione potrebbero coprire l'intero intervallo.

Se uno di From_dateo To_dateè compreso tra le date oppure From_dateè inferiore alla data di inizio ed To_dateè maggiore della data di fine; quindi questa riga dovrebbe essere restituita.


Risposta della pagina (Y)
GreenROBO

Come restituire tutti i dati se entrambe le date di immissione sono nulle o vuote? e inoltre, se una delle date è nulla o vuota, il risultato dovrebbe essere ottenuto in base a quel criterio
Coding world,

40

Prova a seguire la query per ottenere date comprese nell'intervallo:

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

8
Questo non copre tutte le possibilità!
FallenAngel

@FallenAngel, puoi spiegarmi quali non sono coperti?
Babblo

4
Controlla la mia risposta , per favore, non hai coperto le vendite iniziate prima start_datema terminate tra il start_datee end_date. D'altra parte, la domanda non è abbastanza chiara, immagino, non abbiamo idea se dovremmo prendere le vendite che sono rigorosamente tra date date o date che includono parzialmente l'intervallo di date, ma possono estendersi su un lato o sull'altro o su entrambi? Quindi il problema di base è che la domanda non è chiara, immagino.
FallenAngel

So che questo post è vecchio ma per coloro che leggono: Questo non è tra le date ma è inclusivo delle date. Da e a.
Ken

23
SELECT * FROM Product_sales 
WHERE From_date between '2013-01-03'
AND '2013-01-09'

La tua selezione sarà sbagliata per l'esempio From_date: 2012-12-30 to To_Date: 2013-01-05. Queste date sono all'interno dell'intervallo desiderato ma nel tuo SQL non verranno restituite perché iniziano prima dell'intervallo, ma finiscono all'interno dell'intervallo.
NetVicious

5

Questo copre tutte le condizioni che stai cercando.

SELECT * from Product_sales where (From_date <= '2013-01-09' AND To_date >= '2013-01-01')

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'
)

1
Per l'intersezione inclusiva, dovrai aggiungere un'altra clausola OR da catturare quando from_date è prima dell'inizio e to_date è dopo la fine: OR (To_date <= '2013-08-19' AND From_date> = '2013-08- 23 ')
jhorback

3

Vi preghiamo di provare:

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)

3

Solo i miei 2 centesimi, trovo che usare il formato "dd-MMM-yyyy" sia più sicuro in quanto il server db saprà cosa vuoi indipendentemente dalle impostazioni regionali sul server. Altrimenti potresti potenzialmente incorrere in problemi su un server che ha le sue impostazioni internazionali di data come aaaa-gg-mm (per qualsiasi motivo)

Quindi:

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

Ha sempre funzionato bene per me ;-)


3

Funziona su SQL_Server_2008 R2

Select * 
from Product_sales
where From_date 
between '2013-01-03' and '2013-01-09'

3
select * 
from table 
where
( (table.EndDate > '2013-01-05') and (table.StartDate < '2013-01-07' )  )

2

Questa domanda ti aiuterà:

select * 
from XXXX
where datepart(YYYY,create_date)>=2013 
and DATEPART(YYYY,create_date)<=2014

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)  
                   )  
                ) 
         )

1

Controlla questa query, ho creato questa query per verificare se la data di check-in supera le date di prenotazione

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

questo riavvierà i dettagli che si sovrappongono, per ottenere i dettagli non sovrapposti quindi rimuoverà il "NON" dalla query


1

Puoi anche provare a utilizzare i seguenti frammenti:

select  * from  Product_sales 
where  From_date  >= '2013-01-03' and game_date  <= '2013-01-09'

1

È facile, utilizza questa query per trovare dati selezionati nell'intervallo di date compreso tra due date

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

0

Dovresti confrontare le date in sql proprio come confronti i valori numerici,

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

0

Ecco una query per trovare tutte le vendite di prodotti in corso durante il mese di agosto

  • Trova Product_sales erano attive durante il mese di agosto
  • Includere tutto ciò che è iniziato prima della fine di agosto
  • Escludi tutto ciò che è terminato prima del 1 agosto

Aggiunge anche un'istruzione case per convalidare la query

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; 

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))

-1

questo è facile, usa questa query per trovare quello che vuoi.

select * from Product_Sales where From_date<='2018-04-11' and To_date>='2018-04-11'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.