risposta-alla-domanda-sullo-sviluppo-web-bd.com

Query SQL per selezionare le date tra due date

Ho un start_date e end_date. Voglio ottenere l'elenco delle date tra queste due date. Qualcuno può aiutarmi a indicare l'errore nella mia domanda.

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

Qui Date è una variabile datetime.

231
Neeraj

dovresti mettere quelle due date tra virgolette come ..

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

o può usare

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

Poiché un datetime senza un segmento temporale specificato avrà un valore di date 00:00:00.000, se si vuole essere certi di ottenere tutte le date nell'intervallo, è necessario specificare l'ora della data di fine o aumentare la data di fine e utilizzare <.

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'

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

NON utilizzare quanto segue, in quanto potrebbe restituire alcuni record dal 2011/02/28 se i loro orari sono 00: 00: 00.000.

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

Prova questo:

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

I valori di data devono essere digitati come stringhe.

Per garantire la futura protezione della query per SQL Server 2008 e versioni successive, Date deve essere preceduto dall'esclusione perché è un Word riservato nelle versioni successive.

Tieni presente che le date senza orario prendono mezzanotte come valore predefinito, quindi potresti non avere il valore corretto lì.

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

Qui, per prima cosa aggiungi un giorno alla data corrente, sarà 2011-02-28 00:00:00, quindi sottrai un secondo per rendere la data di fine 2011-02-27 23:59:59. In questo modo, è possibile ottenere tutte le date tra gli intervalli indicati.

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

Questa query è valida per il recupero dei valori tra la data corrente e le sue prossime 3 date

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

Questo alla fine aggiungerà ulteriori 3 giorni di buffer alla data corrente.

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

- se il tipo di dati è diverso

5
hamze shoae

Questo è molto vecchio, ma date un sacco di esperienze che ho avuto con le date, si potrebbe voler considerare questo: le persone usano impostazioni regionali diverse, in quanto tali, alcune persone (e alcuni database/computer, a seconda delle impostazioni regionali) possono leggere questo data 11/12/2016 come 11 dicembre 2016 o 12 novembre 2016. Inoltre, il 16/11/12 fornito al database MySQL verrà convertito internamente al 12 novembre 2016, mentre il database Access in esecuzione su un computer di impostazione regionale del Regno Unito interpreterà e archivialo come 16 novembre 2012.

Pertanto, ho reso la mia politica esplicita ogni volta che ho intenzione di interagire con date e database. Quindi fornisco sempre le mie domande e codici di programmazione come segue:

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

Nota inoltre che Access accetterà il #, quindi:

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

ma MS SQL server no, quindi uso sempre "" come sopra, che entrambi i database accettano.

E quando ottengo quella data da una variabile nel codice, converto sempre il risultato in stringa come segue:

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

Sto scrivendo questo perché so che a volte alcuni programmatori potrebbero non essere abbastanza entusiasti da rilevare la conversione intrinseca. Non ci saranno errori per le date <13, solo risultati diversi!

Per quanto riguarda la domanda, aggiungi un giorno all'ultima data e effettua il confronto come segue:

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

Prova a inserire le date tra # # Ad esempio:

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

Ha funzionato per me.

--- EDIT --- Ho ricevuto una notifica che ho perso due punti reputazione perché qualcuno ha votato questa risposta. Per favore, non limitarti a votare se la risposta non funziona per te. Richiedi ulteriori informazioni/aiuto nei commenti o controlla altre soluzioni.

Non mi importa dei punti reputazione - dico solo che i voti negativi non sono fatti per quello.

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

miglior query per la data selezionata tra la data corrente e indietro tre giorni :

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

miglior query per la data selezionata tra la data corrente e i prossimi tre giorni :

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

se la sua data in 24 ore e l'inizio della mattina e la fine della notte dovrebbero aggiungere qualcosa come: 

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

possiamo usare tra per mostrare due dati di date ma questo cercherà tutti i dati e li confronterà in modo da rendere il nostro processo lento per enormi dati, quindi suggerisco a tutti di usare datediff:

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

qui il calendario è la tabella, dt come variabile della data di partenza e dt2 è la variabile della data di finitura.

1
Bipul Roy

Controlla qui sotto Esempi: sia di lavoro che di non lavoro.

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

E sotto non funziona:

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

Vorrei andare

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

La logica è che >= include l'intera data di inizio e < esclude la data di fine, quindi aggiungiamo un'unità alla data di fine. Questo può essere adattato per mesi, ad esempio:

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

Mi piace utilizzare la sintassi '1 MonthName 2015' per le date ex:

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

per le date

0
Juan