Sql-Server
將日期時間列轉換為秒數
在我的 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;
執行
由於上述計算並不太複雜,只需在查詢中包含計算即可。希望您使用儲存過程進行數據訪問,這樣您就不會經常重複這一點。