Risposte:
Quanto segue aggiunge -1 anni alla data corrente:
SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
Ho trovato questa pagina mentre cercavo una soluzione che mi aiutasse a selezionare i risultati di un anno solare precedente. La maggior parte dei risultati mostrati sopra sembra restituire articoli degli ultimi 365 giorni, il che non ha funzionato per me.
Allo stesso tempo, mi ha dato indicazioni sufficienti per risolvere le mie esigenze nel codice seguente, che sto pubblicando qui per tutti gli altri che hanno la stessa esigenza del mio e che potrebbero imbattersi in questa pagina alla ricerca di una soluzione.
SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate()))
Grazie a quelli sopra le cui soluzioni mi hanno aiutato ad arrivare a ciò di cui avevo bisogno.
Beh, penso che qui manchi qualcosa. L'utente desidera ottenere i dati dall'ultimo anno e non dagli ultimi 365 giorni. C'è un'enorme differenza. A mio parere, i dati dell'ultimo anno sono tutti i dati del 2007 (se sono nel 2008 ora). Quindi la risposta giusta sarebbe:
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1
Quindi, se vuoi limitare questa query, puoi aggiungere qualche altro filtro, ma sempre la ricerca nell'ultimo anno.
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'
Il più leggibile, IMO:
SELECT * FROM TABLE WHERE Date >
DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))
Quale:
Ci sono varianti con DATEDIFF e DATEADD per farti arrivare la mezzanotte di oggi, ma tendono ad essere piuttosto ottuse (anche se leggermente migliori in termini di prestazioni - non che noteresti rispetto alle letture richieste per recuperare i dati).
GETDATE () restituisce la data e l'ora correnti .
Se l'anno scorso inizia a mezzanotte del giorno corrente dell'anno scorso (come nell'esempio originale) dovresti usare qualcosa come:
DECLARE @start datetime
SET @start = dbo.getdatewithouttime(DATEADD(year, -1, GETDATE())) -- cut time (hours, minutes, ect.) -- getdatewithouttime() function doesn't exist in MS SQL -- you have to write one
SELECT column1, column2, ..., columnN FROM table WHERE date >= @start
Gli altri suggerimenti sono utili se hai "solo SQL".
Tuttavia suggerisco, se possibile , di calcolare la data nel programma e di inserirla come stringa nella query SQL.
Almeno per le tabelle di grandi dimensioni (cioè diversi milioni di righe, magari combinate con i join) che ti darà un notevole miglioramento della velocità poiché l'ottimizzatore può funzionare molto meglio con quello.
argomento per la funzione DATEADD:
DATEADD (*datepart* , *number* , *date* )
datepart può essere: yy, qq, mm, dy, dd, wk, dw, hh, mi, ss, ms
numero è un'espressione che può essere risolta in un int che viene aggiunto a una datapart di date
date è un'espressione che può essere risolta in un valore time, date, smalldatetime, datetime, datetime2 o datetimeoffset.
declare @iMonth int
declare @sYear varchar(4)
declare @sMonth varchar(2)
set @iMonth = 0
while @iMonth > -12
begin
set @sYear = year(DATEADD(month,@iMonth,GETDATE()))
set @sMonth = right('0'+cast(month(DATEADD(month,@iMonth,GETDATE())) as varchar(2)),2)
select @sYear + @sMonth
set @iMonth = @iMonth - 1
end
Io, come @DE White, sono venuto qui per ragioni simili ma diverse rispetto alla domanda originale. La domanda originale richiede gli ultimi 365 giorni. La risposta di @ samjudson lo fornisce. La risposta di @DE White restituisce i risultati per l'anno solare precedente.
La mia domanda è leggermente diversa in quanto funziona per l' anno precedente fino alla data corrente inclusa:
SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))
Ad esempio, il 17 febbraio 2017 questa query restituisce risultati dal 1 ° gennaio 2016 al 17 febbraio 2017
Ho avuto un problema simile ma il programmatore precedente ha fornito solo la data nel formato mm-aaaa. La mia soluzione è semplice ma potrebbe rivelarsi utile per alcuni (volevo anche essere sicuro che gli spazi iniziali e finali fossero eliminati):
SELECT ... FROM ....WHERE
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >= DATEADD(year,-1,GETDATE())