SQL Server: recupera i dati solo per l'anno passato


98

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'

Risposte:


196

Quanto segue aggiunge -1 anni alla data corrente:

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

1
Il tuo è più pulito ma ecco quello che ho avuto: YEAR (GETDATE ()) - 1
PCPGMR

2
Questo ti restituisce un numero, non una data, non potresti quindi confrontarlo con una data, senza calcolare anche l'anno di quella data. Ciò restituirebbe risultati errati per il 31 dicembre 2014 rispetto al 1 gennaio 2015 - che sono in anni diversi, ma non a distanza di un anno ...
samjudson

corretta. Avevo bisogno di confrontare gli anni per numero di anno, quindi dal 2013 al 2014, ad esempio, poiché i dati in arrivo avevano solo l'anno. Non sono stato chiaro nel mio commento. Grazie
PCPGMR

Ho ricevuto un messaggio di errore durante l'esecuzione di questa query ... "FUNCTION DatabaseName.DATEADD non esiste" Qualche suggerimento?
Marcello Perri

10

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.


7

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'

Questo avrà prestazioni pessime su grandi tabelle, interrogherai ogni record per valutare il valore dell'anno della data, sarebbe meglio usare un intervallo di date
Adriaan Davel


4

Il più leggibile, IMO:

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

Quale:

  1. Ottiene il datetime GETDATE () = # 8/27/2008 10:23 am#
  2. Converte in una stringa con formato 101 CONVERT (varchar, # 8/27/2008 10:23 am#, 101) = '8/27/2007'
  3. Converte in un CONVERT datetime (datetime, '8/27/2007') = # 8/27/2008 12:00 AM#
  4. Sottrae 1 anno DATEADD (yy, -1, # 8/27/2008 12:00 AM#) = # 8/27/2007 12:00 AM#

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).


2

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

0

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.


2
Sarebbe meglio se crei una stringa parametrizzata ed eviti di inserire il valore nella stringa stessa ...
Adriaan Davel

0

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.


0
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

1
Questo non risponde alla domanda.
Nathan Skerl

Inoltre, mentre i loop sono generalmente dannosi per SQL
StingyJack

0

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


0

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())

0

Per qualche motivo nessuno dei risultati sopra ha funzionato per me.

Seleziona gli ultimi 365 giorni.

 SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()

sarebbe utile se potessi aggiungere la versione del server MSSQL per cui funziona.
stato l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.