146 votes

Sélectionnez des données dans une plage de dates entre deux dates

J'ai une table nommée Product_Sales et elle contient des données comme suit

ID_produit

Vendu_par

Qté

Date_debut

Date_fin

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 veux sélectionner les données de vente entre deux dates d'une plage de dates ?

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

1 votes

À ce jour > 2013-01-03 ET Depuis < 2013-01-09.?

231voto

dmlukichev Points 1166

description de l'intersection d'intervalles

Comme vous pouvez le constater, il y a deux façons de faire les choses:

  • énumérer toutes les options acceptables
  • exclure toutes les options incorrectes

De toute évidence, la deuxième méthode 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)

83 votes

Je veux juste dire que j'adore que tu ais dessiné cela sur un tableau blanc pour expliquer la réponse. Tu as mon respect et mon admiration.

8 votes

Je sais que ce problème est assez ancien mais si vous ne voulez pas ou ne pouvez pas utiliser cette condition WHERE NOT, en changeant les opérateurs et en ajoutant un égal fait également l'affaire : SELECT * FROM Product_sales WHERE From_date <= @RangeTill OR To_date >= @RangeFrom

8 votes

@LaurenzGlück pas OR, cela devrait être SELECT * FROM Product_sales WHERE From_date <= @RangeTill AND To_date >= @RangeFrom

131voto

FallenAngel Points 5887
SÉLECTIONNER * de Product_sales où
(From_date ENTRE '2013-01-03'ET '2013-01-09') OU 
(To_date ENTRE '2013-01-03' ET '2013-01-09') OU 
(From_date <= '2013-01-03' ET To_date >= '2013-01-09')

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

Si l'une des From_date ou To_date est entre les dates, ou From_date est inférieure à la date de début et To_date est supérieure à la date de fin; alors cette ligne devrait être retournée.

2 votes

Réponse De la Page (Y)

0 votes

Comment retourner toutes les données si la date d'entrée est nulle ou vide? De plus, si l'une des dates est nulle ou vide, les résultats doivent être basés sur ce critère.

46voto

jkmurphy1 Points 657

Essayez la requête suivante pour obtenir les dates comprises dans la plage :

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

12 votes

Cela ne couvre pas toutes les possibilités!

0 votes

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

4 votes

Verifiez ma réponse s'il vous plaît, vous n'avez pas couvert les ventes qui ont commencé avant la start_date mais qui se sont terminées entre start_date et end_date. D'un autre côté, la question n'est pas assez claire je suppose, nous n'avons aucune idée de savoir si nous devrions prendre en compte les ventes strictement entre les deux 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 ? Donc le problème fondamental concerne le manque de clarté de la question je suppose.

26voto

Berkay Points 1396
SÉLECTIONNER * DE Product_sales 
OÙ From_date entre '2013-01-03'
ET '2013-01-09'

0 votes

Votre sélection sera incorrecte pour l'exemple De_date: 2012-12-30 à To_Date: 2013-01-05. Ces dates sont à l'intérieur de la plage désirée mais dans votre SQL ne seront pas retournées car elles commencent avant la plage, mais elles se terminent à l'intérieur de la plage.

12voto

Avinash Points 374

Ceci couvre toutes les conditions que vous recherchez.

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

2 votes

Ce devrait être la bonne réponse. Vous devez utiliser la fonction from_date avec <= la date la plus récente avec AND et la fonction to_date >= la date la plus ancienne. Tous les cas sont couverts de cette manière en faisant un peu de magie booléenne et c'est plus simple que les réponses ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X