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
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
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
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. –
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. –
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)
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.
eliminare dalla YourTable dove DateColumn < getdate() - 1
È 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 " –