web-dev-qa-db-fra.com

Sélectionner des données dans la plage de dates entre deux dates

J'ai une table nommée Product_Sales et 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 veux sélectionner des données de vente entre deux dates dans une plage de dates?

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

79
Ronjon

interval intersection description

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

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

Évidemment, la deuxième voie est beaucoup plus simple (deux cas seulement contre quatre).

Votre SQL ressemblera à:

SELECT * FROM Product_sales 
WHERE NOT (From_date > @RangeTill OR To_date < @RangeFrom)
116
dmlukichev
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 pourrait être entre votre plage de dates ou les dates d'enregistrement pourraient couvrir la plage entière.

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

64
FallenAngel

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

SELECT  *
FROM    Product_sales 
WHERE   From_date >= '2013-01-03' AND
        To_date   <= '2013-01-09'
34
jkmurphy1
SELECT * FROM Product_sales 
WHERE From_date between '2013-01-03'
AND '2013-01-09'
16
Berkay Turancı
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'
)
4
Kiran K
select * 
from table 
where
( (table.EndDate > '2013-01-05') and (table.StartDate < '2013-01-07' )  )
3
Gestef

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
TechDo

Juste mes 2 centimes, 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, quels que soient les paramètres régionaux définis sur le serveur. Sinon, vous pourriez potentiellement 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).

Ainsi:

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

Cela a toujours bien fonctionné pour moi ;-)

2
KDT

Cette requête vous aidera à:

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

Cela fonctionne sur SQL_Server_2008 R2

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

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

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

Vous pouvez aussi essayer d'utiliser les fragments suivants:

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

Vérifiez cette requête, j'ai créé cette requête pour vérifier si la date d'arrivée au 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)

ceci retournera les détails qui se chevauchent, pour obtenir les détails qui ne se chevauchent pas, puis supprimez le "NON" de la requête

1
anand360
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
zafarsiddiqui

Vous devriez 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
Adeel Ahmed

Cela couvre toutes les conditions que vous recherchez.

SELECT * from Product_sales where (From_date <= '2013-01-09' AND To_date >= '2013-01-01')
0
Avinash
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))
0
JIYAUL MUSTAPHA

Voici une requête pour trouver toutes les ventes de produits en cours d’exécution au mois d’août.

  • Trouver des ventes de produits là-bas ont été actifs pendant le mois d'août
  • Incluez tout ce qui a commencé avant la fin août
  • Exclure tout ce qui s'est terminé avant le 1er août

Ajoute également une déclaration de cas 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
jspooner

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'
0
Abdirazack

Ce code fonctionnera bien:

Manette:

$this->load->model("YourModelName");
$data ['query'] = $this->YourModelName->get_report();

Modèle:

  public function get_report()
     {   
       $query = $this->db->query("SELECT  *
FROM   reservation WHERE arvdate <= '2016-7-20' AND  dptrdate >= '2016-10-25' ");
       return $query;
     }

où 'arvdate' et 'dptrdate' sont deux dates dans la base de données et 'réservation' est le nom de la table.

Vue:

<?php
 echo $query->num_rows();
?>

Ce code doit renvoyer le nombre de lignes. Pour renvoyer les données de la table, utilisez ensuite

$query->rows();
return $row->table_column_name;
0
Infolet.org