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
.
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'
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'
O
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'
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ì.
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
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.
select * from test
where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'
- se il tipo di dati è diverso
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'
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.
select Date,TotalAllowance
from Calculation
where EmployeeId=1
and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27'
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)
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'
Select
*
from
Calculation
where
EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#;
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.
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**
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)
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