Sélectionnez les données de la plage de dates entre deux dates


100

J'ai une table nommée Product_Saleset elle contient des données comme celle-ci

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

Maintenant, quelle est la requête si je souhaite sélectionner des données de vente entre deux dates dans une plage de dates?

Par exemple, je souhaite sélectionner les données de vente de 2013-01-03à 2013-01-09.


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

Réponses:


144

description de l'intersection d'intervalle

Comme vous pouvez le voir, il existe deux façons de faire avancer les choses:

  • enrôlez toutes les options acceptables
  • exclure toutes les mauvaises options

Evidemment, la seconde voie est beaucoup plus simple (seulement deux cas contre quatre).

Votre SQL ressemblera à:

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

13
Je veux juste dire que j'adore le fait que vous ayez dessiné ceci sur un tableau blanc pour expliquer la réponse. Vous avez mon respect et mon admiration.
Ben Bynum

3
Je sais que ce problème est assez ancien, mais si vous ne voulez pas ou ne pouvez pas utiliser cette WHERE NOTcondition, retourner les opérateurs et ajouter un égal fait également le travail: 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')

Vous devez couvrir toutes les possibilités. From_Date ou To_Date peut être compris entre votre plage de dates ou les dates d'enregistrement peuvent couvrir toute la plage.

Si l'une des dates From_dateou To_dateest comprise entre les dates, ou From_dateest inférieure à la date de début et To_dateest supérieure à la date de fin; alors cette ligne doit être renvoyée.


Réponse de la page (Y)
GreenROBO

Comment renvoyer toutes les données si la date de saisie est nulle ou vide? et aussi, si l'une des dates est nulle ou vide, devrait obtenir un résultat basé sur ces critères
Coding world

40

Essayez la requête suivante pour obtenir des dates comprises entre la plage:

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

8
Cela ne couvre pas toutes les possibilités!
FallenAngel

@FallenAngel, pouvez-vous s'il vous plaît m'expliquer lesquels ne sont pas couverts?
Babblo

4
Vérifiez ma réponse s'il vous plaît, vous n'avez pas couvert les ventes qui ont commencé avant start_datemais qui se sont terminées entre start_dateet end_date. D'un autre côté, la question n'est pas assez claire, je suppose, nous ne savons pas si nous devrions prendre des ventes strictement entre des dates données ou des dates qui incluent partiellement la plage de dates, mais qui peuvent s'étendre d'un côté ou de l'autre ou des deux? Le problème fondamental est donc que la question n'est pas claire, je suppose.
FallenAngel

Je sais que cet article est vieux mais pour ceux qui lisent: Ce n'est pas entre les dates mais il inclut les dates. De et à.
Ken

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

Votre sélection sera erronée pour l'exemple From_date: 2012-12-30 to To_Date: 2013-01-05. Ces dates se trouvent dans la plage souhaitée, mais dans votre SQL ne seront pas renvoyées car elles commencent avant la plage, mais elles se terminent dans la plage.
NetVicious

5

Cela couvre toutes les conditions que vous recherchez.

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
Pour l'intersection inclusive, vous voudrez ajouter une autre clause OR à attraper lorsque la date_depuis est avant le début et la date_départ après la fin: OR (To_date <= '2013-08-19' AND From_date> = '2013-08- 23 ')
jhorback

3

S'il vous plaît essayez:

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

Juste mes 2 cents, je trouve que l'utilisation du format "jj-MMM-aaaa" est la plus sûre car le serveur de base de données saura ce que vous voulez indépendamment des paramètres régionaux sur le serveur. Sinon, vous pourriez rencontrer des problèmes sur un serveur dont les paramètres régionaux de date sont aaaa-jj-mm (pour quelque raison que ce soit)

Donc:

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

Cela a toujours bien fonctionné pour moi ;-)


3

Cela fonctionne sur 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

Cette requête vous aidera:

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

Vérifiez cette requête, j'ai créé cette requête pour vérifier si la date d'arrivée sur le tour avec des dates de réservation

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

cela retransmettra les détails qui se chevauchent, pour obtenir les détails qui ne se chevauchent pas, puis supprimera le 'NON' de la requête


1

Vous pouvez également essayer d'utiliser les fragments suivants:

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

1

C'est facile, utilisez cette requête pour rechercher des données sélectionnées dans la plage de dates entre deux dates

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

0

Vous devez comparer les dates en SQL comme vous comparez les valeurs numériques,

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

0

Voici une requête pour trouver toutes les ventes de produits en cours au cours du mois d'août

  • Trouvez les ventes de produits actives au cours du mois d'août
  • Incluez tout ce qui a commencé avant la fin du mois d'août
  • Excluez tout ce qui s'est terminé avant le 1er août

Ajoute également une instruction case pour valider la requête

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

c'est facile, utilisez cette requête pour trouver ce que vous voulez.

select * from Product_Sales where From_date<='2018-04-11' and To_date>='2018-04-11'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.