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