Convierta una columna de fecha y hora en número de segundos

11

En mi base de datos de SQL Server, tengo una datetimecolumna.

¿Cuál es una buena manera de crear una nueva columna que represente el longvalor de la datetimecolumna? El longrepresentaría una cantidad de segundos.

Pensé que si podía convertirlo longs, sería más fácil agrupar por consultas durante períodos de tiempo, ya que podría dividir el número largo por cantidades fijas.

La tabla es estática, no se actualizará ni eliminará datos.

dublintech
fuente

Respuestas:

13

Cree una nueva columna (ALTER TABLE) y luego ejecute una ACTUALIZACIÓN

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

19000101es la época de SQL Server. Puedes usar 19700101para Unix epoch por ejemplo

gbn
fuente
12

Puede agregar una nueva columna y actualizarla manualmente como sugirió @gbn, pero ahora tiene que mantener constantemente esta columna actualizada con activadores de inserción / actualización o algún otro mecanismo. Tomando en cuenta las conjeturas de @ gbn sobre los nombres de tabla / columna, aquí hay un par de enfoques diferentes que no requieren mantenimiento constante.

Columna calculada

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

También puede persistir e indexar esta columna, intercambiando el rendimiento de la consulta por el almacenamiento, pero deberá realizar un ligero cambio en el cálculo (intentar persistir en lo anterior generará un error acerca de que el cálculo no es determinista):

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;

Desearía mantener la columna si le preocupa más el rendimiento de lectura que el rendimiento de escritura (o el almacenamiento).

Ver

Una ventaja de una vista sobre una nueva columna es que no tiene que cambiar el esquema de la tabla base (o preocuparse por mantenerlo actualizado). Usted paga el costo del cálculo en el momento de la consulta, que es lo mismo que una columna calculada no persistente.

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

Tiempo de ejecución

Como los cálculos anteriores no son demasiado complejos, solo incluya el cálculo en su consulta. Con suerte, está utilizando procedimientos almacenados para el acceso a datos, por lo que no está repitiendo esto con frecuencia.

Aaron Bertrand
fuente