Sql-Server

將日期時間列轉換為秒數

  • July 9, 2019

在我的 SQL Server 數據庫中,我有一datetime列。

什麼是創建代表列long值的新列的好方法datetime?將long代表秒數。

我想如果我可以將它轉換為longs,它會更容易在一段時間內按查詢進行分組,因為我可以將長數字除以固定數量。

該表是靜態的,不會更新或刪除數據。

創建一個新列(ALTER TABLE),然後對其執行 UPDATE

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

19000101是 SQL Server 紀元。例如,您可以19700101用於 Unix 紀元

您可以添加一個新列並按照@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;

執行

由於上述計算並不太複雜,只需在查詢中包含計算即可。希望您使用儲存過程進行數據訪問,這樣您就不會經常重複這一點。

引用自:https://dba.stackexchange.com/questions/18042