2009-10-19 5 views
20

In una tabella nel mio datatase ho una colonna datatime che memorizza l'ora in cui viene aggiunto il record. Come posso eliminare tutti i record più vecchi di un giorno quando eseguo una stored procedure (considerando l'ora corrente)?Elimina elementi più vecchi di un giorno - SQL Server

risposta

28

È possibile creare un'istruzione DELETE utilizzando le funzioni datediff e getdate. esempio

Usage:

DELETE FROM yourTable WHERE DATEDIFF(day,getdate(),thatColumn) < -1 
+2

È ottenuto questo all'indietro. In base alla domanda, "thatColumn" sarà sempre nel passato e il modo in cui lo hai scritto, il tuo DATEDIFF sarà sempre maggiore di 0. Il modo corretto è: "ELIMINA DA tuaTabella WHERE DATEDIFF (giorno, getdate(), thatColumn) <-1 " Oppure:" ELIMINA DA tuaTabella WHERE DATEDIFF (giorno, thatColumn, getdate())> 1 " –

5
Delete <TableName> 
Where DATEDIFF(day, <ColumnName>, getdate()) > 0 

Raj

+0

potresti aver dimenticato un 'FROM';) – KB22

+3

Da non è richiesto con un'istruzione delete :) – Raj

+1

+ 1, mio ​​d'oh. ^^ – KB22

0

io in genere sconsiglio dati effettivamente l'eliminazione dal database perché non si sa mai quando potrebbe essere necessario tornare indietro e recuperare o rollback ai record precedenti a causa della corruzione dei dati o di un audit, ecc. Aggiungerei invece un titolo di colonna bit come "IsDeleted" e imposto le voci del giorno precedente su true usando una dichiarazione di aggiornamento.

Qualcosa di simile

'UPDATE tablename SET IsDeleted = 1 WHERE (DATEDIFF(day,DateCreatedOn,GETDATE()) > 0) 

Dove DateCreatedOn è dove del creato o la data timestamp sarebbe andato

+3

Questa è una generalizzazione difficile senza conoscere il problema impostato. Ci sono tanti buoni motivi per cancellare i dati come no. Se è necessario eseguire il rollback o il ripristino, è per questo che si dispone di backup. Se l'operazione standard della tua app significa che non hai più bisogno dei dati, quindi elimina i dati. – Joe

+0

Se non elimini mai i dati, alla fine - inevitabilmente - le tabelle sovraffollate porteranno a prestazioni degradate. Se è necessario mantenere i dati "a caldo", copiarli in una tabella di archivio e quindi eliminarli dall'origine, magari dopo ore, dovrebbe essere un'opzione valida. –

+0

Ammetto che è un po 'zelante, ma è meglio averlo e non averne bisogno, quindi non averlo e averne bisogno. Immaginate il tipo di risposta che otterreste da un cliente che afferma di aver bisogno di tutti i record di vendita dalla loro applicazione di e-Commerce negli ultimi 5 anni e la vostra risposta è "L'abbiamo cancellato perché era vecchio e non è attualmente richiesto dal applicazione". Proprio perché l'applicazione stessa potrebbe non aver bisogno dei dati, non significa che il client non ne ha bisogno e può fare a meno di entrambi. –

-1

o

ts> = ora il record() - PERIODO 1 GIORNO

dove ts è un nome della colonna datetime

+1

E i suoi lavori su SQL Server? – gbn

+0

Sì, sì. Almeno su MySQL. – Zepplock

+0

Quindi si prega di leggere la documentazione prima di -1 altre persone – Zepplock

28

Quando si tratta di SQL, è necessario specificare cosa intendi per "più vecchio di un giorno".

  • DATEDIFF: utilizza giorno confine mezzanotte, quindi eseguirlo al 19 Ottobre 00:05 e ti eliminare le righe 6 minuti vecchi (18 ottobre 23:59)

  • 24 ore?

  • Ieri a mezzanotte? Esegui codice il 19 ottobre, cancella le righe prima del 18?

Inoltre, non inserire una funzione in una colonna.

Questo presuppone 24 ore al minuto:

DELETE 
    MyTableWhere 
WHERE 
    MyColumn < DATEADD(day, -1, GETDATE()) 

Ciò presuppone ieri mezzanotte:

DELETE 
    MyTableWhere 
WHERE 
    MyColumn < DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), -1) 
0

Supponendo colonna della data di essere "RecordCreatedDate"

DELETE FROM YourTable DOVE RecordCreatedDate < DATEADD (d, -1, GETDATE())

Avvertisco solo che se il tuo database contiene milioni di righe, dovresti avere un indice sulla colonna RecordCreatedDate ed eventualmente eliminare più batch se rimuoverai grandi quantità di dati.

0

eliminare dalla YourTable dove DateColumn < getdate() - 1