Hầu như tất cả các Câu trả lời và Nhận xét đều nặng về Ưu điểm và nhẹ về Nhược điểm. Đây là bản tóm tắt của tất cả Ưu và Nhược điểm cho đến nay cộng với một số Nhược điểm quan trọng (ở mục số 2 bên dưới) Tôi chỉ thấy được đề cập một lần hoặc không.
- PROS:
1.1. Tuân thủ ISO nhiều hơn (ISO 8601) (mặc dù tôi không biết làm thế nào điều này đi vào thực tế).
1.2. Nhiều phạm vi hơn (1/1/0001 đến 12/12/9999 so với 1/1 / 1753-12 / 31/9999) (mặc dù phạm vi bổ sung, tất cả trước năm 1753, có thể sẽ không được sử dụng ngoại trừ, ví dụ: trong các ứng dụng lịch sử, thiên văn, địa chất, vv).
1.3. Chính xác phù hợp với phạm vi phạm vi DateTime
Loại của .NET (mặc dù cả hai chuyển đổi qua lại không có mã hóa đặc biệt nếu các giá trị nằm trong phạm vi và độ chính xác của loại mục tiêu ngoại trừ Con # 2.1 bên dưới sẽ xảy ra lỗi / làm tròn số khác).
1.4. Độ chính xác cao hơn (100 nano giây hay 0,000,000,1 giây so với 3,33 mili giây hay 0,003,33 giây) (mặc dù độ chính xác bổ sung có thể sẽ không được sử dụng trừ ví dụ, trong các ứng dụng kỹ thuật / khoa học).
1.5. Khi được cấu hình cho tương tự (như trong 1 millisec không "giống nhau" (như trong 3,33 millisec) như Iman Abidi đã tuyên bố) chính xác nhưDateTime
, sử dụng ít không gian hơn (7 so với 8 byte), nhưng dĩ nhiên, bạn sẽ mất lợi ích chính xác có khả năng là một trong hai (phạm vi khác) được chào mời nhiều nhất mặc dù có thể là lợi ích không cần thiết).
- Nhược điểm:
2.1. Khi truyền tham số cho .NET SqlCommand
, bạn phải chỉ định System.Data.SqlDbType.DateTime2
nếu bạn có thể truyền giá trị bên ngoài SQL ServerDateTime
phạm vi và / hoặc độ chính xác hay không, bởi vì nó mặc định là System.Data.SqlDbType.DateTime
.
2.2. Không thể được chuyển đổi ngầm định / dễ dàng thành giá trị số dấu phẩy động (# ngày kể từ ngày tối thiểu) để thực hiện các thao tác sau với / trong nó trong các biểu thức SQL Server bằng cách sử dụng các giá trị số và toán tử:
2.2.1. cộng hoặc trừ # ngày hoặc một phần ngày. Lưu ý: Sử dụngDateAdd
Hàm như một cách giải quyết không phải là chuyện nhỏ khi bạn cần xem xét nhiều nếu không phải là tất cả các phần của thời gian.
2.2.2. lấy sự khác biệt giữa hai lần tính thời gian cho các mục đích tính toán của tuổi age. Lưu ý: DateDiff
Thay vào đó, bạn không thể đơn giản sử dụng Chức năng của SQL Server , vì nó không tính toán age
như hầu hết mọi người mong đợi ở chỗ nếu hai thời gian ngày xảy ra vượt qua ranh giới thời gian theo lịch / đồng hồ của các đơn vị được chỉ định ngay cả đối với một phần rất nhỏ của đơn vị đó, nó sẽ trả phần chênh lệch như 1 trong tổng số đơn vị so với 0. Ví dụ, DateDiff
trong Day
là hai ngày-thời gian chỉ 1 mili giây ngoài sẽ trở lại 1 vs 0 (ngày) nếu những ngày-thời gian được tính vào các ngày theo lịch khác nhau (ví dụ: 1999 1999-31 23: 59: 59.9999999, và 2000-01-01 00: 00: 00.0000000,). Thời gian chênh lệch 1 mili giây giống nhau nếu được di chuyển để chúng không vượt qua một ngày theo lịch, sẽ trả về một Ngày DateDiff Cá trong Day
0 (ngày).
2.2.3. lấy Avg
thời gian ngày tháng (trong Truy vấn tổng hợp) bằng cách chuyển đổi sang kiểu Float Float trước rồi sau đó quay lại DateTime
.
LƯU Ý: Để chuyển đổi DateTime2
thành số, bạn phải thực hiện một số công thức như công thức sau mà vẫn giả sử giá trị của bạn không thấp hơn năm 1970 (có nghĩa là bạn sẽ mất tất cả phạm vi bổ sung cộng thêm 217 năm nữa. không thể đơn giản điều chỉnh công thức để cho phép phạm vi bổ sung vì bạn có thể gặp phải các sự cố tràn số.
25567 + (DATEDIFF(SECOND, {d '1970-01-01'}, @Time) + DATEPART(nanosecond, @Time) / 1.0E + 9) / 86400.0
- Nguồn: “ https://siderite.dev/blog/how-to-translate-t-sql-datetime2-to.html “
Tất nhiên, bạn cũng có thể Cast
đến DateTime
đầu tiên (và nếu cần thiết trở lại một lần nữa để DateTime2
), nhưng bạn sẽ mất sự chính xác và phạm vi (tất cả trước năm 1753) lợi ích của DateTime2
vs DateTime
đó là prolly 2 lớn nhất và cũng đồng thời prolly 2 khả năng cần thiết ít nhất đặt ra câu hỏi tại sao lại sử dụng nó khi bạn mất các chuyển đổi ngầm định / dễ dàng thành số dấu phẩy động (# ngày) cho phép cộng / trừ / "tuổi" (so với DateDiff
) /Avg
calcs lợi ích lớn theo kinh nghiệm của tôi.
Btw, Avg
thời gian ngày là (hoặc ít nhất nên là) một trường hợp sử dụng quan trọng. a) Bên cạnh việc sử dụng trong việc lấy thời lượng trung bình khi thời gian ngày (kể từ thời gian ngày cơ sở chung) được sử dụng để biểu thị thời lượng (thông lệ chung), b) cũng rất hữu ích để có được thống kê loại bảng điều khiển về ngày trung bình- thời gian nằm trong cột thời gian của một phạm vi / nhóm Hàng. c) Truy vấn đặc biệt (hoặc ít nhất phải là tiêu chuẩn) để theo dõi / khắc phục các giá trị trong Cột có thể không còn hiệu lực bao giờ / lâu hơn nữa và / hoặc có thể cần được phản đối là liệt kê cho mỗi giá trị số lần xuất hiện và (nếu có) Min
, Avg
và Max
tem thời gian được liên kết với giá trị đó.