Domanda

Sto scrivendo una query in cui devo ottenere i dati solo per l'ultimo anno.Qual è il modo migliore per farlo?

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
È stato utile?

Soluzione

Quanto segue aggiunge -1 anni alla data corrente:

SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())

Altri suggerimenti

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 sembrano 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 seguente codice, che pubblico qui per tutti gli altri che hanno la mia stessa esigenza 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 coloro 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 dell'ultimo anno e non degli 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 adesso).Quindi la risposta giusta sarebbe:

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1

Quindi se vuoi restringere questa query, puoi aggiungere qualche altro filtro, ma cercando sempre nell'ultimo anno.

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'

Cerca la data aggiunta in BOL

dateadd(yy,-1,getdate())

Il più leggibile, IMO:

SELECT * FROM TABLE WHERE Date >
   DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))

Quale:

  1. Ottiene l'ora e l'ora di adesso DATA ARRIVATA() = #27/8/2008 10:23#
  2. Converte in una stringa con formato 101 CONVERT(varchar, #27/8/2008 10:23#, 101) = '27/8/2007'
  3. Converte in una data/ora CONVERTI(dataora, '27/8/2007') = #27/8/2008 00:00#
  4. Sottrae 1 anno DATAADD(aa, -1, #27/8/2008 00:00#) = #27/8/2007 00:00#

Esistono varianti con DATEDIFF e DATEADD per ottenere la mezzanotte di oggi, ma tendono ad essere piuttosto ottuse (anche se leggermente migliori in termini di prestazioni, non che noterai rispetto alle letture richieste per recuperare i dati).

GETDATE() restituisce la data corrente E tempo.

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 validi se si dispone di "solo SQL".

Tuttavia suggerisco che - se possibile - calcoli la data nel tuo programma e la inserisci come stringa nella query SQL.

Almeno per i tavoli grandi (ad es.diversi milioni di righe, magari combinate con join) che ti garantiranno un notevole miglioramento della velocità poiché l'ottimizzatore può funzionare molto meglio con questo.

argomento per la funzione DATEADD:

DATEADD (*datepart* , *number* , *date* )

datapart può essere:aa, qq, mm, g, gg, sett, g, hh, mi, ss, ms

numero è un'espressione che può essere risolta in un int che viene aggiunto a datepart di date

data è un'espressione che può essere risolta in un valore di ora, data, 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 @D.E.White, è venuto qui per ragioni simili ma diverse rispetto alla domanda originale.La domanda originale riguarda gli ultimi 365 giorni.La risposta di @ Samjudson lo prevede.@D.E.La risposta di White restituisce i risultati per l'anno solare precedente.

La mia query è leggermente diversa in quanto funziona per the 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/1/2016 al 17/02/2017

Ho avuto un problema simile ma il programmatore precedente forniva 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())
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top