Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Chuyển đổi ‘datetime2’ thành ‘time’ trong SQL Server (Ví dụ T-SQL)

Bài viết này chứa các ví dụ về chuyển đổi datetime2 giá trị thành thời gian giá trị trong SQL Server.

Một trong những lợi ích của việc chuyển đổi datetime2 giá trị thành thời gian là bạn giảm kích thước lưu trữ từ 6 đến 8 byte, xuống từ 3 đến 5 byte (tùy thuộc vào độ chính xác mà mỗi kiểu dữ liệu đã gán cho nó). Nói một cách chính xác, 1 byte phụ được sử dụng để lưu trữ độ chính xác cho các kiểu dữ liệu này, vì vậy bạn nên thêm 1 byte vào số lượng này.

Rõ ràng là bạn mất phần ngày trong quá trình chuyển đổi, nhưng bạn sẽ không thực hiện chuyển đổi này nếu bạn cần giữ lại phần ngày.

Khi bạn chuyển đổi datetime2 giá trị thành thời gian , chỉ phần thời gian của giá trị được sao chép. Kết quả chính xác sẽ phụ thuộc vào độ chính xác giây phân số được gán cho từng loại. Khi thời gian độ chính xác nhỏ hơn datetime2 độ chính xác, giây phân số được làm tròn để phù hợp với thời gian độ chính xác.

Về độ chính xác, cả hai loại dữ liệu đều cho phép bạn chỉ định tỷ lệ từ 0 chữ số thập phân đến 7. Do đó, bạn có khả năng thực hiện chuyển đổi mà không mất bất kỳ giây phân số nào hoặc làm tròn kết quả.

Ví dụ 1 - Chuyển đổi ngầm định

Dưới đây là ví dụ về chuyển đổi ngầm định giữa datetime2 thời gian .

 DECLARE @ thedatetime2 datetime2, @thetime time; SET @ thedatetime2 ='2025-05-21 10:15:30.1234567'; SET @thetime =@ thedatetime2; SELECT @ thedatetime2 AS 'datetime2', @thetime AS 'time'; 

Kết quả:

 + ----------------------------- + ---------------- - + | datetime2 | thời gian || ----------------------------- + ----------------- - || 2025-05-21 10:15:30.1234567 | 10:15:30.1234567 | + ----------------------------- + ------------- ----- + 

Đây là một chuyển đổi ngầm định bởi vì chúng tôi không sử dụng một hàm chuyển đổi (như những hàm bên dưới) để chuyển đổi nó một cách rõ ràng. Trong trường hợp này, SQL Server thực hiện một chuyển đổi ẩn đằng sau hậu trường khi chúng tôi cố gắng gán datetime2 giá trị thành thời gian biến.

Điều rõ ràng nhất về kết quả này là thời gian giá trị không bao gồm ngày. Điều này được mong đợi, vì thời gian kiểu dữ liệu chỉ để lưu trữ các giá trị thời gian, không phải giá trị ngày tháng.

Ngoài ra, trong ví dụ này, cả hai kiểu dữ liệu đều sử dụng độ chính xác mặc định của chúng (là thang điểm 7). Điều này có nghĩa là thời gian giá trị kết thúc với cùng độ chính xác với datetime2 giá trị. Lý do tôi biết họ sử dụng độ chính xác mặc định là vì tôi đã không chỉ định tỷ lệ thứ hai phân số khi khai báo chúng.

Ví dụ 2 - Chuyển đổi sang Độ chính xác cao hơn

Trong ví dụ này, thời gian biến sử dụng độ chính xác cao hơn cho datetime2 Biến đổi.

 DECLARE @ thedatetime2 datetime2 (4), @thetime time (7); SET @ thedatetime2 ='2025-05-21 10:15:30.1234567'; SET @thetime =@ thedatetime2; SELECT @ thedatetime2 AS 'datetime2', @thetime AS 'time'; 

Kết quả:

 + -------------------------- + ------------------ + | datetime2 | thời gian || -------------------------- + ------------------ || 2025-05-21 10:15:30.1235 | 10:15:30.1235000 | + -------------------------- + ------------------ - + 

Trong trường hợp này, datetime2 biến sử dụng thang điểm 4 và thời gian biến sử dụng 7.

Điều này dẫn đến datetime2 làm tròn số giây phân số, vì vậy chúng tôi nhận được 1235 thay vì 1234 . Điều đó cũng có nghĩa là khi chúng tôi chuyển đổi nó thành thời gian , giá trị kết thúc bằng 3 số không ở cuối (vì chúng tôi đã chỉ định thang điểm là 7). Điều này cũng có nghĩa là thời gian kích thước lưu trữ của giá trị là 5 byte (6 bao gồm độ chính xác) so với 4 byte (5 bao gồm độ chính xác) nếu chúng tôi đặt cho nó tỷ lệ 4.

Ví dụ 3 - Chuyển đổi thành Độ chính xác thấp hơn

Trong ví dụ này, thời gian biến sử dụng độ chính xác thấp hơn cho datetime2 Biến đổi.

 DECLARE @ thedatetime2 datetime2 (7), @thetime time (0); SET @ thedatetime2 ='2025-05-21 10:15:30.5678912'; SET @thetime =@ thedatetime2; SELECT @ thedatetime2 AS 'datetime2', @thetime AS 'time'; 

Kết quả:

 + ----------------------------- + ---------- + | datetime2 | thời gian || ----------------------------- + ---------- || 2025-05-21 10:15:30.5678912 | 10:15:31 | + ----------------------------- + ---------- +  

Vì vậy, trong trường hợp này thời gian Tỷ lệ ‘s được giảm xuống 0, có nghĩa là không có giây phân số nào được đưa vào kết quả. Ngoài ra, các giây cũng được làm tròn lên tương ứng.

thời gian giá trị sử dụng 4 byte lưu trữ (bao gồm cả độ chính xác), so với 9 byte cho datetime2 giá trị (và được so sánh với 6 byte cho thời gian giá trị trong ví dụ trước).

Ví dụ 4 - Chuyển đổi rõ ràng bằng CAST ()

Dưới đây là một ví dụ về chuyển đổi rõ ràng. Trong trường hợp này, tôi sử dụng CAST() hoạt động trực tiếp trong SELECT tuyên bố để chuyển đổi rõ ràng giữa datetime2 thời gian .

 DECLARE @ thedatetime2 datetime2 (3); SET @ thedatetime2 ='2025-05-21 10:15:30.123'; SELECT @ thedatetime2 AS 'datetime2', CAST (@ thedatetime2 AS time (0)) AS 'time ( 0) '; 

Kết quả:

 + ------------------------- + ----------- + | datetime2 | thời gian (0) || ------------------------- + ----------- || 2025-05-21 10:15:30.123 | 10:15:30 | + ------------------------- + ----------- + 

Ví dụ 5 - Chuyển đổi rõ ràng bằng CONVERT ()

Dưới đây là một ví dụ về chuyển đổi rõ ràng bằng cách sử dụng CONVERT() hàm thay vì CAST() .

 DECLARE @ thedatetime2 datetime2 (3); SET @ thedatetime2 ='2025-05-21 10:15:30.123'; SELECT @ thedatetime2 AS 'datetime2', CONVERT (time (0), @ thedatetime2) AS 'time ( 0) '; 

Kết quả:

 + ------------------------- + ----------- + | datetime2 | thời gian (0) || ------------------------- + ----------- || 2025-05-21 10:15:30.123 | 10:15:30 | + ------------------------- + ----------- + 

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn dữ liệu bằng cách kết hợp hai bảng trong hai cơ sở dữ liệu trên các máy chủ khác nhau

  2. Cách khắc phục “Yêu cầu GIAO DỊCH COMMIT không có GIAO DỊCH BẮT ĐẦU tương ứng” trong SQL Server

  3. Các ký tự không phải số trả về số dương khi sử dụng ISNUMERIC () trong SQL Server

  4. Cách hàm TRANSLATE () hoạt động trong SQL Server (T-SQL)

  5. Cách tốt nhất cho khóa chính trong bảng là gì?