Risposte:
dovresti mettere quelle due date tra virgolette singole 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'
tieni presente che il primo appuntamento è inclusivo, ma il secondo è esclusivo, in quanto è effettivamente "27/02/2011 00:00:00"
between
dovrebbe funzionare come previsto.
Poiché un datetime senza un determinato segmento di tempo avrà un valore di date 00:00:00.000
, se vuoi essere sicuro di ottenere tutte le date nel tuo intervallo, devi fornire l'ora per la 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'
O
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, poiché potrebbe restituire alcuni record dal 28/02/2011 se i loro tempi sono 00: 00: 00.000.
select Date,TotalAllowance from Calculation where EmployeeId=1
and Date between '2011/02/25' and '2011/02/28'
'2011/02/28 00:00:00.000'
?
convert(date, Date) between '2011/02/25' and '2011/02/27'
(almeno con un recente MS SQL Server). La convert()
parte si occuperà di eliminare la parte temporale e il confronto tra le due parti funzionerà come previsto.
Prova questo:
select Date,TotalAllowance from Calculation where EmployeeId=1
and [Date] between '2011/02/25' and '2011/02/27'
I valori della data devono essere digitati come stringhe.
Per garantire una query a prova di futuro per SQL Server 2008 e versioni successive, è Date
necessario eseguire l'escape perché è una parola riservata nelle versioni successive.
Tieni presente che le date senza orari prendono la mezzanotte come impostazioni predefinite, 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, prima aggiungi un giorno alla data di fine corrente, lo sarà 2011-02-28 00:00:00
, quindi sottrai un secondo per stabilire 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
select * from test
where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'
- se il tipo di dati è diverso
Questa query è utile per recuperare i valori tra la data corrente e le successive 3 date
SELECT * FROM tableName WHERE columName
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)
Questo alla fine aggiungerà altri 3 giorni di buffer alla data corrente.
Questo è molto vecchio, ma date molte esperienze che ho avuto con le date, potresti prendere in considerazione questo: le persone usano impostazioni regionali diverse, come tali, alcune persone (e alcuni database / computer, a seconda delle impostazioni regionali) possono leggere questo data dell'11 / 12/2016 come l'11 dicembre 2016 o il 12 novembre 2016. Ancora di più, il 16/11/12 fornito al database MySQL verrà convertito internamente al 12 novembre 2016, mentre il database di Access in esecuzione su un computer con impostazione regionale del Regno Unito interpreterà e archiviarlo come 16 nov 2012.
Pertanto, ho reso esplicita la mia politica ogni volta che ho intenzione di interagire con date e database. Quindi fornisco sempre le mie domande e i miei codici di programmazione come segue:
SELECT FirstName FROM Students WHERE DoB >= '11 Dec 2016';
Si noti inoltre che Access accetterà il #, quindi:
SELECT FirstName FROM Students WHERE DoB >= #11 Dec 2016#;
ma MS SQL Server non lo farà, 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 di rilevare la conversione intrinseca. Non ci saranno errori per le date <13, solo risultati diversi!
Per quanto riguarda la domanda posta, aggiungi un giorno all'ultima data ed effettua il confronto come segue:
dated >= '11 Nov 2016' AND dated < '15 Nov 2016'
Prova ad inserire le date tra # # per esempio:
#2013/4/4# and #2013/4/20#
Ha funzionato per me.
se la sua data tra 24 ore e inizia al mattino e termina alla sera dovrebbe aggiungere qualcosa di simile:
declare @Approval_date datetime
set @Approval_date =getdate()
Approval_date between @Approval_date +' 00:00:00.000' and @Approval_date +' 23:59:59.999'
migliore query per la data selezionata tra la data corrente e tre giorni precedenti :
select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN
DATE_SUB(CURDATE(), INTERVAL 3 DAY) AND CURDATE()
migliore 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)
Controlla di seguito Esempi: sia funzionanti che non funzionanti.
select * from tblUser Where
convert(varchar(10),CreatedDate,111) between '2015/04/01' and '2016/04/01' //--**Working**
O
select * from tblUser Where
(CAST(CreatedDate AS DATETIME) between CAST('2015/04/01' AS DATETIME) And CAST('2016/4/30'AS DATETIME)) //--**Working**
O
select * from tblUser Where
(YEAR(CreatedDate) between YEAR('2015/04/01') And YEAR('2016/4/30'))
//--**Working**
E di seguito 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**
possiamo usare tra per mostrare i dati di due date ma questo cercherà tutti i dati e li confronterà in modo da rallentare il nostro processo per dati enormi, 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 inizio e dt2 è la variabile della data di fine.
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 ed <
esclude la data di fine, quindi aggiungiamo un'unità alla data di fine. Questo può adattarsi per mesi, ad esempio:
select Date, ... from ...
where Date >= $start_month_day_1 and Date < DATEADD(m, 1, $end_month_day_1)
Select
*
from
Calculation
where
EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#;
Davvero tutte le date sql dovrebbero essere nel formato aaaa-MM-gg per i risultati più accurati.
/****** Script for SelectTopNRows command from SSMS ******/
SELECT TOP 10 [Id]
,[Id_parvandeh]
,[FirstName]
,[LastName]
,[RegDate]
,[Gilder]
,[Nationality]
,[Educ]
,[PhoneNumber]
,[DueInMashhad]
,[EzdevajDate]
,[MarriageStatus]
,[Gender]
,[Photo]
,[ModifiedOn]
,[CreatorIp]
From
[dbo].[Socials] where educ >= 3 or EzdevajDate >= '1992/03/31' and EzdevajDate <= '2019/03/09' and MarriageStatus = 1
è meglio scrivere in questo modo:
CREATE PROCEDURE dbo.Get_Data_By_Dates
(
@EmployeeId INT = 1,
@Start_Date DATE,
@End_Date Date
)
AS
Select * FROM Calculation
where EmployeeId=@EmployeeId AND Test_Date BETWEEN @Start_Date AND @End_Date
RETURN
SELECT Date, TotalAllowance
FROM Calculation
WHERE EmployeeId = 1
AND Date BETWEEN to_date('2011/02/25','yyyy-mm-dd')
AND to_date ('2011/02/27','yyyy-mm-dd');