web-dev-qa-db-fra.com

Requête SQL pour sélectionner des dates entre deux dates

J'ai un start_date et un end_date. Je veux obtenir la liste des dates entre ces deux dates. Quelqu'un peut-il m'aider à signaler l'erreur dans ma requête?.

select Date,TotalAllowance 
from Calculation 
where EmployeeId=1
  and Date between 2011/02/25 and 2011/02/27

Ici Date est une variable datetime.

231
Neeraj

vous devriez mettre ces deux dates entre guillemets simples comme ..

select Date, TotalAllowance from Calculation where EmployeeId = 1
             and Date between '2011/02/25' and '2011/02/27'

ou peut utiliser

select Date, TotalAllowance from Calculation where EmployeeId = 1
             and Date >= '2011/02/25' and Date <= '2011/02/27'
394
Deepak

Etant donné qu'une date-heure sans segment de temps spécifié aura la valeur date 00:00:00.000, si vous voulez être sûr d'obtenir toutes les dates de votre plage, vous devez indiquer l'heure de votre date de fin ou augmenter votre date de fin et utiliser <.

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date between '2011/02/25' and '2011/02/27 23:59:59.999'

OR

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date >= '2011/02/25' and Date < '2011/02/28'

OU 

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date >= '2011/02/25' and Date <= '2011/02/27 23:59:59.999'

N'UTILISEZ PAS ce qui suit, car certains enregistrements pourraient être renvoyés au 28/02/2011 si leur heure est 00: 00: 00.000.

select Date,TotalAllowance from Calculation where EmployeeId=1 
and Date between '2011/02/25' and '2011/02/28'
106
WelshDragon

Essaye ça:

select Date,TotalAllowance from Calculation where EmployeeId=1
             and [Date] between '2011/02/25' and '2011/02/27'

Les valeurs de date doivent être saisies sous forme de chaînes.

Pour assurer la pérennité de votre requête pour SQL Server 2008 et versions supérieures, Date doit être échappé car il s'agit d'un mot réservé dans les versions ultérieures.

Gardez à l'esprit que les dates sans heure prennent par défaut minuit, il est donc possible que vous n'ayez pas la valeur correcte.

13
user114600
select * from table_name where col_Date between '2011/02/25' 
AND DATEADD(s,-1,DATEADD(d,1,'2011/02/27'))

Ici, ajoutez d’abord un jour à la date de fin actuelle, ce sera 2011-02-28 00:00:00, puis vous soustrayerez une seconde pour obtenir la date de fin 2011-02-27 23:59:59. En faisant cela, vous pouvez obtenir toutes les dates entre les intervalles donnés.

output:
2011/02/25
2011/02/26
2011/02/27
9
Chandra Prakash

Cette requête est utile pour récupérer les valeurs entre la date du jour et ses 3 prochaines dates

SELECT * FROM tableName  WHERE columName 
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)

Cela ajoutera éventuellement 3 jours supplémentaires de mémoire tampon à la date actuelle.

6
Vinit Kadkol
select * from test 
     where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'

- si le type de données est différent

5
hamze shoae

C’est très ancien, mais compte tenu de l’expérience que j’ai eue avec les dates, vous voudrez peut-être en tenir compte: les gens utilisent différents paramètres régionaux; certaines personnes (et certaines bases de données/ordinateurs, selon les paramètres régionaux) peuvent donc lire ceci. date du 11/12/2016 au 11 décembre 2016 ou au 12 novembre 2016. Encore plus important, le 16/11/12 fourni à la base de données MySQL sera converti en interne au 12 novembre 2016, tandis que la base de données Access fonctionnant sur un ordinateur régional britannique stockez-le le 16 novembre 2012.

Par conséquent, ma politique était d’être explicite chaque fois que je vais interagir avec des dates et des bases de données. Donc, je fournis toujours mes requêtes et codes de programmation comme suit:

SELECT FirstName FROM Students WHERE DoB >= '11 Dec 2016';

Notez également que Access acceptera le #, ainsi:

SELECT FirstName FROM Students WHERE DoB >= #11 Dec 2016#;

mais MS SQL Server ne le fera pas, donc j’utilise toujours "" comme ci-dessus, ce que les deux bases de données acceptent.

Et lorsque je récupère cette date à partir d'une variable dans le code, je convertis toujours le résultat en chaîne de la manière suivante:

"SELECT FirstName FROM Students WHERE DoB >= " & myDate.ToString("d MMM yyyy")

J'écris ceci parce que je sais que parfois certains programmeurs peuvent ne pas être assez enthousiastes pour détecter la conversion inhérente. Il n'y aura pas d'erreur pour les dates <13, mais des résultats différents!

Quant à la question posée, ajoutez un jour à la dernière date et effectuez la comparaison comme suit:

dated >= '11 Nov 2016' AND dated < '15 Nov 2016' 
4
Hannington Mambo

Essayez de mettre les dates entre # # Par exemple:

#2013/4/4# and #2013/4/20#

Cela a fonctionné pour moi.

--- EDIT --- J'ai reçu une notification indiquant que j'avais perdu deux points de réputation parce que quelqu'un avait voté contre. S'il vous plaît, ne faites pas que voter à la baisse si la réponse ne vous convient pas. Demandez des informations supplémentaires/aide dans les commentaires, ou vérifiez d'autres solutions.

Je me fiche des points de réputation - je dis simplement que les votes à la baisse ne sont pas faits pour cela.

3
Casper
select Date,TotalAllowance 
from Calculation 
where EmployeeId=1
  and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27'
3
njtd

meilleure requête pour la date sélectionnée entre la date actuelle et le trois jours précédents:

  select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN       
DATE_SUB(CURDATE(), INTERVAL 3 DAY)  AND CURDATE() 

meilleure requête pour la date sélectionnée entre la date du jour et le les trois prochains jours:

  select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN   
   CURDATE()  AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)   
2
user3223432

si sa date est dans 24 heures et commence le matin et se termine la nuit devrait ajouter quelque chose comme: 

declare @Approval_date datetime
set @Approval_date =getdate()
Approval_date between @Approval_date +' 00:00:00.000' and @Approval_date +' 23:59:59.999'
1
Sheryar Nizar
Select 
    * 
from 
    Calculation 
where 
    EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#;
1
Saad Sheikh

nous pouvons utiliser entre pour afficher deux données de date, mais cela va rechercher toutes les données et comparer, ce qui ralentira notre processus pour des données volumineuses. Je suggère donc à tout le monde d’utiliser datediff:

qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 "

ici, le calendrier est la table, dt est la variable de date de début et dt2 est la variable de date de fin.

1
Bipul Roy

Vérifiez ci-dessous Exemples: actifs et non actifs.

select * from tblUser Where    
convert(varchar(10),CreatedDate,111) between '2015/04/01' and '2016/04/01' //--**Working**

OR

select * from tblUser Where
(CAST(CreatedDate AS DATETIME) between CAST('2015/04/01' AS DATETIME) And CAST('2016/4/30'AS DATETIME)) //--**Working**

OR

select * from tblUser Where
(YEAR(CreatedDate) between YEAR('2015/04/01') And YEAR('2016/4/30')) 
//--**Working**

ET ci-dessous ne fonctionne pas:

select * from tblUser Where
Convert(Varchar(10),CreatedDate,111) >=  Convert(Varchar(10),'01-01-2015',111) and  Convert(Varchar(10),CreatedDate,111) <= Convert(Varchar(10),'31-12-2015',111) //--**Not Working**


select * from tblUser Where
(Convert(Varchar(10),CreatedDate,111) between Convert(Varchar(10),'01-01-2015',111) And Convert(Varchar(10),'31-12-2015',111)) //--**Not Working**
1
Tobbin Well

Vraiment, toutes les dates SQL devraient être au format aaaa-MM-jj pour des résultats plus précis.

0

Vous pouvez essayer ce SQL

select * from employee where rec_date between '2017-09-01' and '2017-09-11' 
0
Kamran

J'irais pour

select Date,TotalAllowance from Calculation where EmployeeId=1
             and Date >= '2011/02/25' and Date < DATEADD(d, 1, '2011/02/27')

La logique étant que >= inclut la date de début complète et que < exclut la date de fin, nous ajoutons donc une unité à la date de fin. Cela peut être adapté pendant des mois, par exemple:

select Date, ... from ...
             where Date >= $start_month_day_1 and Date < DATEADD(m, 1, $end_month_day_1)
0
entonio

J'aime utiliser la syntaxe '1 MonthName 2015' pour les dates ex:

   WHERE aa.AuditDate>='1 September 2015'
     AND aa.AuditDate<='30 September 2015'

pour les dates

0
Juan