Answers:
您可以添加新列并按照@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;
运行
由于上述计算并不过于复杂,因此只需在查询中包括该计算即可。希望您使用存储过程进行数据访问,因此您不必经常重复此过程。