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

Chuyển đổi ‘smalldatetime’ 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 smalldatetime giá trị thành thời gian giá trị trong SQL Server.

Khi bạn chuyển đổi smalldatetime giá trị thành thời gian , bạn mất ngày. Giờ, phút và giây được sao chép. Số giây phân số được đặt thành 0.

smalldatetime kiểu dữ liệu bao gồm cả ngày và giờ. Tuy nhiên, thời gian không có phân số giây nào và thành phần giây của nó luôn được đặt thành 0 (:00). Độ chính xác của nó chính xác đến từng phút. Kích thước lưu trữ của nó là 4 byte.

thời gian mặt khác, kiểu dữ liệu chỉ bao gồm thời gian. Tuy nhiên, nó cho phép bạn chỉ định độ chính xác giây phân số từ 0 đến 7. Điều này đạt được bằng cách sử dụng time ( n ) cú pháp, trong đó n là thang đo từ 0 đến 7. Nếu bạn không chỉ định điều này, nó sẽ sử dụng 7 (mặc định), cung cấp độ chính xác 100 nano giây. Nếu bạn chỉ định số 0 (0 ), độ chính xác của nó sẽ chính xác đến từng giây. Kích thước lưu trữ của nó sẽ là 3, 4 hoặc 5 byte (cộng thêm 1 byte để lưu trữ độ chính xác), tùy thuộc vào độ chính xác của phân số giây.

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

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

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'time';

Kết quả:

+---------------------+----------+
| smalldatetime       | time     |
|---------------------+----------|
| 2025-05-21 10:16:00 | 10:16:00 |
+---------------------+----------+

Đâ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 chỉ định smalldatetime 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.

Cái gì không hiển nhiên (ít nhất là với ví dụ của tôi) là giá trị thời gian thực sự có thể xử lý một phần giây phân số. Hệ thống của tôi không hiển thị giây phân số ở đây, nhưng ví dụ tiếp theo sẽ cho thấy rằng thực tế nó có độ chính xác giây phân số là 7.

Ngoài ra, nếu bạn quan sát kỹ, bạn sẽ thấy rằng smalldatetime giá trị làm tròn số phút từ giá trị thực mà tôi đang cố gắng gán cho nó. Điều này phản ánh độ chính xác tương đối thấp của smalldatetime loại dữ liệu. Độ chính xác của nó chính xác đến từng phút gần nhất. Hệ quả rõ ràng của việc này là khi cuối cùng chúng ta chỉ định lại giá trị của nó cho thời gian kiểu dữ liệu, đó là giá trị làm tròn được chỉ định - không phải giá trị ban đầu mà tôi đã cố gắng chỉ định. Nếu chúng tôi đã chỉ định giá trị ban đầu trực tiếp cho thời gian , chúng tôi sẽ nhận được một giá trị chính xác hơn (ngay cả khi chúng tôi đã chỉ định thang điểm bằng 0).

Đây là ý tôi:

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'time';

Kết quả:

+---------------------+----------+
| smalldatetime       | time     |
|---------------------+----------|
| 2025-05-21 10:16:00 | 10:15:30 |
+---------------------+----------+

Ví dụ 2 - Thêm Phân số Giây

smalldatetime loại dữ liệu không có phần giây phân số, nhưng trong ví dụ đầu tiên của chúng tôi, thời gian giá trị có độ chính xác phân số giây là 7 (mặc dù nó không thực sự hiển thị bất kỳ vị trí thập phân nào). Tôi biết độ chính xác của nó vì tôi không chỉ định thang điểm khi khai báo, do đó nó sử dụng thang đo mặc định là 7.

Dưới đây là một ví dụ để xác nhận rằng thời gian trên thực tế, giá trị có thể hỗ trợ một phần phân số:

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'Original time',
  DATEADD(nanosecond, 123456700, @thetime) AS 'Modified time';

Kết quả:

+---------------------+-----------------+------------------+
| smalldatetime       | Original time   | Modified time    |
|---------------------+-----------------+------------------|
| 2025-05-21 10:16:00 | 10:16:00        | 10:16:00.1234567 |
+---------------------+-----------------+------------------+

Lưu ý rằng khi thời gian value có tỷ lệ là 7, nó có kích thước lưu trữ là 5 byte. Do đó, nó có yêu cầu lưu trữ cao hơn smalldatetime loại (chỉ sử dụng 4 byte).

Ví dụ 3 - 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 câu lệnh để chuyển đổi rõ ràng giữa smalldatetime thời gian .

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  CAST(@thesmalldatetime AS time(0)) AS 'time(0)';

Kết quả:

+---------------------+-----------+
| smalldatetime       | time(0)   |
|---------------------+-----------|
| 2025-05-21 10:16:00 | 10:16:00  |
+---------------------+-----------+

Trong ví dụ này, tôi đặt tỷ lệ thành 0.

Ví dụ 4 - 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 @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  CONVERT(time(0), @thesmalldatetime) AS 'time(0)';

Kết quả:

+---------------------+-----------+
| smalldatetime       | time(0)   |
|---------------------+-----------|
| 2025-05-21 10:16:00 | 10:16:00  |
+---------------------+-----------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Câu lệnh ALTER TABLE xung đột với ràng buộc FOREIGN KEY

  2. Cách sử dụng Từ dừng và Danh sách dừng để cải thiện Tìm kiếm toàn văn bản (FTS) của SQL Server

  3. Trả lại danh sách tất cả các kích hoạt máy chủ trong SQL Server

  4. Không thể bắt đầu một giao dịch phân tán

  5. Lỗi nghiêm trọng:Gọi đến hàm không xác định sqlsrv_connect () trong C:\ xampp \ htdocs