Chuyển đổi cột thời gian thành số giây


11

Trong cơ sở dữ liệu SQL Server của tôi, tôi có một datetimecột.

Một cách tốt để tạo một cột mới đại diện cho longgiá trị cho datetimecột là gì? Điều longnày sẽ đại diện cho một số giây.

Tôi nghĩ rằng nếu tôi có thể chuyển đổi nó thành longs, nó sẽ giúp nhóm dễ dàng hơn bằng cách truy vấn theo các khoảng thời gian, vì tôi chỉ có thể chia số dài cho số tiền cố định.

Bảng là tĩnh, Sẽ không cập nhật hoặc xóa dữ liệu.

Câu trả lời:


13

Tạo một cột mới (ALTER TABLE) sau đó chạy CẬP NHẬT trên đó

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

19000101là kỷ nguyên máy chủ SQL. Bạn có thể sử dụng 19700101cho Unix epoch chẳng hạn


12

Bạn có thể thêm một cột mới và cập nhật thủ công như @gbn đã đề xuất, nhưng bây giờ bạn phải liên tục cập nhật cột này với các kích hoạt chèn / cập nhật hoặc một số cơ chế khác. Mượn dự đoán của @ gbn về tên bảng / cột, đây là một vài cách tiếp cận khác nhau không cần bảo trì liên tục.

Cột tính toán

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

Bạn cũng có thể kiên trì và lập chỉ mục cột này, đánh đổi hiệu năng truy vấn để lưu trữ, nhưng bạn sẽ cần thực hiện một thay đổi nhỏ cho phép tính (cố gắng duy trì ở trên sẽ dẫn đến lỗi về tính toán không xác định):

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;

Bạn sẽ muốn duy trì cột nếu bạn quan tâm đến hiệu suất đọc hơn hiệu suất ghi (hoặc lưu trữ).

Lượt xem

Một lợi ích của chế độ xem trên một cột mới là bạn không phải thay đổi lược đồ bảng cơ sở (hoặc lo lắng về việc cập nhật nó). Bạn phải trả chi phí tính toán tại thời điểm truy vấn, giống như một cột được tính không tồn tại.

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

Thời gian chạy

Vì các tính toán trên không quá phức tạp, chỉ cần đưa tính toán vào truy vấn của bạn. Hy vọng rằng bạn đang sử dụng các thủ tục được lưu trữ để truy cập dữ liệu để bạn không lặp lại điều này thường xuyên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.