将日期时间列转换为秒数

dub*_*ech 11 sql-server-2008 sql-server t-sql type-conversion datetime

在我的 SQL Server 数据库中,我有一datetime列。

创建代表列long值的新列的好方法是什么datetime?在long将表示了若干秒。

我想如果我可以将它转换为longs,那么在一段时间内按查询分组会更容易,因为我可以将长数除以固定数量。

该表是静态的,不会更新或删除数据。

gbn*_*gbn 13

创建一个新列(ALTER TABLE)然后对其运行更新

UPDATE
  MyTable
SET
  NewIntColumn = DATEDIFF(SECOND, '19000101', MyDateTimeColumn)
Run Code Online (Sandbox Code Playgroud)

19000101是 SQL Server 时代。例如,您可以19700101用于 Unix 纪元


Aar*_*and 12

您可以添加一个新列并按照@gbn 的建议手动更新它,但现在您必须使用插入/更新触发器或其他一些机制不断使该列保持最新。借用@gbn 对表/列名称的猜测,这里有几种不同的方法,不需要经常维护。

计算列

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));
Run Code Online (Sandbox Code Playgroud)

您还可以保留并索引此列,权衡存储的查询性能,但您需要对计算进行轻微更改(尝试保留上述内容将产生关于计算不确定性的错误):

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;
Run Code Online (Sandbox Code Playgroud)

如果您更关心读取性能而不是写入性能(或存储),您可能希望保留该列。

看法

新列上的视图的一个好处是您不必更改基表架构(或担心使其保持最新)。您在查询时支付计算成本,这与非持久计算列相同。

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

运行

由于上述计算并不太复杂,只需在查询中包含计算即可。希望您使用存储过程进行数据访问,这样您就不会经常重复这一点。