将日期时间列转换为秒数


11

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

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

我认为,如果可以将其转换为longs,则可以更轻松地按时间段进行分组查询,因为我可以将长整数除以固定数量。

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

Answers:


13

创建一个新列(ALTER TABLE),然后在其上运行一个UPDATE

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

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


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

您还可以保留该列并为其建立索引,以权衡存储的查询性能,但是您需要对计算进行一些更改(尝试保留以上内容将产生有关不确定性计算的错误):

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;

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

视图

视图相对于新列的一个好处是您不必更改基表模式(或担心保持其最新状态)。您需要在查询时支付计算成本,这与非持久计算列相同。

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

运行

由于上述计算并不过于复杂,因此只需在查询中包括该计算即可。希望您使用存储过程进行数据访问,因此您不必经常重复此过程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.