Converti una colonna datetime in numero di secondi


11

Nel mio database di SQL Server, ho una datetimecolonna.

Qual è un buon modo per creare una nuova colonna che rappresenta il longvalore per la datetimecolonna? Il longrappresenterebbe un certo numero di secondi.

Ho pensato che se potessi convertirlo in longs, renderebbe più facile raggruppare le query per periodi di tempo, dato che potrei semplicemente dividere il numero lungo per importi fissi.

La tabella è statica, non aggiornerà o eliminerà i dati.

Risposte:


13

Crea una nuova colonna (ALTER TABLE) quindi esegui un AGGIORNAMENTO su di essa

UPDATE
  MyTable
SET
  NewIntColumn = DATEDIFF(SECOND, '19000101', MyDateTimeColumn)

19000101è l'epoca di SQL Server. Ad esempio, è possibile utilizzare 19700101per l'epoca Unix


12

È possibile aggiungere una nuova colonna e aggiornarla manualmente come suggerito da @gbn, ma ora è necessario mantenere costantemente aggiornata questa colonna con i trigger di inserimento / aggiornamento o altri meccanismi. Prendendo in prestito le ipotesi di @ gbn sui nomi di tabelle / colonne, qui ci sono un paio di approcci diversi che non richiedono una manutenzione costante.

Colonna calcolata

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, '19000101', MyDateTimeColumn));

--or for Unix epoch

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, '19700101', MyDateTimeColumn));

Potresti anche persistere e indicizzare questa colonna, scambiando le prestazioni delle query per l'archiviazione, ma dovrai apportare una leggera modifica al calcolo (provare a persistere quanto sopra produrrà un errore sul calcolo non deterministico):

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, 0, MyDateTimeColumn)) PERSISTED;

-- or for Unix epoch

ALTER TABLE dbo.MyTable ADD NewIntColumn AS
  CONVERT(INT, DATEDIFF(SECOND, 25567, MyDateTimeColumn)) PERSISTED;

Si desidera mantenere la colonna se si è più preoccupati per le prestazioni di lettura che per le prestazioni di scrittura (o archiviazione).

Visualizza

Un vantaggio di una vista su una nuova colonna è che non è necessario modificare lo schema della tabella di base (o preoccuparsi di mantenerlo aggiornato). Paghi il costo del calcolo al momento della query, che è lo stesso di una colonna calcolata non persistente.

CREATE VIEW dbo.vMyTable
AS
  SELECT -- other columns,
    MyDateTimeColumn,
    NewIntColumn = DATEDIFF(...whichever calc above makes sense...)
  FROM dbo.MyTable;

Runtime

Poiché i calcoli sopra riportati non sono eccessivamente complessi, è sufficiente includere il calcolo nella query. Spero che tu stia utilizzando le procedure memorizzate per l'accesso ai dati, quindi non lo ripeti spesso.

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.