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

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

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

Khi bạn chuyển đổi thời gian giá trị thành datetime2 , thông tin bổ sung được thêm vào giá trị. Điều này là do datetime2 kiểu dữ liệu chứa cả thông tin ngày và giờ. thời gian mặt khác, kiểu dữ liệu chỉ chứa thông tin thời gian.

Cụ thể hơn, ngày được đặt thành '1900-01-01' (trừ khi nó tình cờ được làm tròn thành '1900-01-02'), thành phần thời gian được sao chép và theo tài liệu của Microsoft, chênh lệch múi giờ được đặt thành 00:00 (mặc dù datetime2 kiểu dữ liệu không nhận biết múi giờ và không bảo toàn bất kỳ độ lệch múi giờ nào).

Khi độ chính xác phân số giây của datetime2 (n) giá trị lớn hơn time (n) giá trị, giá trị được làm tròn lên.

Ví dụ 1 - 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 từ thời gian đến datetime2 .

DECLARE @thetime time;
SET @thetime = '23:15:59.004007';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetime2) AS 'datetime2';

Kết quả:

+------------------+-----------------------------+
| time             | datetime2                   |
|------------------+-----------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 |
+------------------+-----------------------------+

Khi bạn chuyển đổi từ thời gian đến datetime2 , một thành phần ngày được thêm vào và đặt thành 1900-01-01 .

Tuy nhiên, có những trường hợp trong đó ngày có thể được làm tròn thành 1900-01-02 . Điều này sẽ phụ thuộc vào giây phân số và độ chính xác bạn sử dụng. Xem bên dưới để biết ví dụ về điều này.

Ví dụ 2 - Độ chính xác của phân số giây

Bạn có thể nhận được các kết quả khác nhau tùy thuộc vào độ chính xác của phân số giây được gán cho từng loại dữ liệu. Điều này sẽ phụ thuộc vào giá trị thực của phần phân số.

Trong ví dụ trước, cả hai kiểu dữ liệu đều sử dụng cùng độ chính xác giây phân số. Điều này là do tôi không chỉ định tỷ lệ (để xác định độ chính xác của chúng) và do đó cả hai đều sử dụng giá trị tỷ lệ mặc định của mình (cả hai đều là 7).

Chỉ cần rõ ràng, thang đo là số chữ số ở bên phải dấu thập phân của một số. Độ chính xác là tổng số chữ số trong số.

Dù sao, trong ví dụ đó, tôi chỉ gán 6 chữ số thập phân cho giá trị ban đầu, do đó, số 0 được thêm vào cuối.

Đây là những gì sẽ xảy ra nếu tôi chỉ định độ chính xác cao hơn cho thời gian giá trị so với datetime2 giá trị:

DECLARE @thetime time(7);
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetime2(4)) AS 'datetime2(4)';

Kết quả:

+------------------+--------------------------+
| time             | datetime2(4)             |
|------------------+--------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1235 |
+------------------+--------------------------+

Bằng cách chỉ định thang điểm 4 cho datetime2 giá trị, kết quả được giảm xuống 4 chữ số thập phân và trong trường hợp này, kết quả được làm tròn.

Như bạn có thể mong đợi, nó không chỉ là phần phân số có thể được làm tròn. Dưới đây là một ví dụ về nơi mà phần phân số làm cho phút và giây được làm tròn:

DECLARE @thetime time(7);
SET @thetime = '23:15:59.7654321';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetime2(0)) AS 'datetime2(0)';

Kết quả:

+------------------+---------------------+
| time             | datetime2(0)        |
|------------------+---------------------|
| 23:15:59.7654321 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Tuy nhiên, bạn có thể nhận được các kết quả khác nhau cho cùng một dữ liệu bằng cách thay đổi độ chính xác. Nếu chúng tôi tăng độ chính xác, thậm chí chỉ bằng một chữ số thập phân, chúng tôi nhận được điều này:

DECLARE @thetime time(7);
SET @thetime = '23:15:59.7654321';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetime2(1)) AS 'datetime2(1)';

Kết quả:

+------------------+-----------------------+
| time             | datetime2(1)          |
|------------------+-----------------------|
| 23:15:59.7654321 | 1900-01-01 23:15:59.8 |
+------------------+-----------------------+

Vì vậy, trong trường hợp này, phút và giây không làm tròn (nhưng mili giây đã ).

Đây là những gì sẽ xảy ra nếu tôi đặt thời gian giá trị để sử dụng thang độ chính xác thấp hơn datetime2 giá trị.

DECLARE @thetime time(0);
SET @thetime = '23:15:59.004007';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetime2) AS 'datetime2';

Kết quả:

+----------+-----------------------------+
| time     | datetime2                   |
|----------+-----------------------------|
| 23:15:59 | 1900-01-01 23:15:59.0000000 |
+----------+-----------------------------+

Và trong khi chúng tôi đang làm việc đó, đây là một ví dụ về trường hợp thang đo độ chính xác của chúng tôi có thể dẫn đến giây phân số khiến ngày được làm tròn sang ngày tiếp theo:

DECLARE @thetime time(7);
SET @thetime = '23:59:59.9999999';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetime2(0)) AS 'datetime2(0)';

Kết quả:

+------------------+---------------------+
| time             | datetime2(0)        |
|------------------+---------------------|
| 23:59:59.9999999 | 1900-01-02 00:00:00 |
+------------------+---------------------+

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

Điều này giống với ví dụ đầu tiên, ngoại trừ lần này tôi sử dụng CONVERT() hàm thay vì CAST() .

DECLARE @thetime time;
SET @thetime = '23:15:59.004007';
SELECT 
  @thetime AS 'time',
  CONVERT(datetime2, @thetime) AS 'datetime2';

Kết quả:

+------------------+-----------------------------+
| time             | datetime2                   |
|------------------+-----------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 |
+------------------+-----------------------------+

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

Dưới đây là một ví dụ về việc thực hiện điều tương tự, nhưng sử dụng chuyển đổi kiểu ngầm định.

DECLARE @thetime time, @thedatetime2 datetime2;
SET @thetime = '23:15:59.004007';
SET @thedatetime2 = @thetime;
SELECT 
  @thetime AS 'time',
  @thedatetime2 AS 'datetime2';

Kết quả:

+------------------+-----------------------------+
| time             | datetime2                   |
|------------------+-----------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 |
+------------------+-----------------------------+

Vì vậy, chúng tôi nhận được cùng một kết quả, bất kể đó là chuyển đổi rõ ràng hay ẩn.

Đây là một chuyển đổi ngầm định vì chúng tôi không sử dụng một hàm chuyển đổi để chuyển đổi một cách rõ ràng. Chúng tôi chỉ đơn giản là chỉ định giá trị từ một biến của một kiểu dữ liệu cho một biến của một kiểu dữ liệu khác. 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 ấn định thời gian giá trị thành datetime2 biến.

Ví dụ 5 - Thay đổi ngày

Nếu bạn cần thay đổi ngày (nhưng giữ nguyên thời gian), bạn có thể sử dụng DATEADD() hàm số.

DECLARE @thetime time, @thedatetime2 datetime2;
SET @thetime = '23:15:59.004007';
SET @thedatetime2 = @thetime;
SET @thedatetime2 = DATEADD(year, 120, @thedatetime2);
SELECT 
  @thetime AS 'time',
  @thedatetime2 AS 'datetime2';

Kết quả:

+------------------+-----------------------------+
| time             | datetime2                   |
|------------------+-----------------------------|
| 23:15:59.0040070 | 2020-01-01 23:15:59.0040070 |
+------------------+-----------------------------+

Trong trường hợp này, tôi thêm 120 vào giá trị năm, giá trị này sẽ đưa nó đến năm 2020.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server câu lệnh tham gia có điều kiện

  2. Cú pháp không chính xác gần ')' gọi thủ tục được lưu trữ với GETDATE

  3. Làm cách nào để tôi có được một Kế hoạch Thực thi Truy vấn trong SQL Server?

  4. Nhập 'xml' vào Sql Server

  5. Cập nhật một bước công việc cho một công việc đại lý máy chủ SQL (T-SQL)