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

Định dạng ngày trong SQL:Cách xử lý nó theo cách thông minh

Nhờ sự đa dạng của các nền văn hóa trên Trái đất, chúng ta có nhiều định dạng ngày tháng. Đối với ngày dạng số, chúng ta có tháng-ngày-năm, ngày-tháng-năm và năm-tháng-ngày. Chúng tôi cũng có các định dạng ngắn và dài. Ngày tháng có thể bị trộn lẫn với thời gian, đó là một câu chuyện khác. Thực tế này theo chúng tôi tại nơi làm việc. Đó là lý do tại sao định dạng ngày trong SQL không phải là thứ mà chúng ta có thể dễ dàng thực hiện.

Ở Philippines, chúng tôi sử dụng 2 định dạng:tháng-ngày-năm và ngày-tháng-năm. Tháng-ngày-năm là định dạng chung cho các ngày dạng số. Nhưng với các định dạng ngày dài hơn, chúng tôi sử dụng thay thế cho ngày-tháng-năm và tháng-ngày-năm.

Tại nơi làm việc, tôi chưa bao giờ gặp phải cài đặt định dạng ngày SQL Server khác tháng-ngày-năm. Tuy nhiên, nó khác nhau trong các báo cáo và tệp để trao đổi dữ liệu và dự án Trích xuất-Biến đổi-Tải (ETL). Hãy để một mình những người dùng thay đổi nó trong đài của họ vì sở thích cá nhân! Với tất cả các tình huống này, không giải quyết chúng một cách thích hợp là một công thức để phá vỡ.

Ứng dụng của bạn có phù hợp với các nền văn hóa khác nhau không? Đó là một mức độ phức tạp khác và là một vấn đề khi xử lý các định dạng ngày SQL khác nhau này. Trong bài viết này, chúng ta sẽ khám phá tiêu chuẩn để đối phó với tất cả các giống và ví dụ này. Đọc tiếp cho đến khi kết thúc! Nhưng trước khi tiếp tục, chúng ta hãy đi một vòng ngắn về cách SQL Server lưu trữ ngày tháng.

Cách SQL Server lưu trữ ngày

Hãy đoán. SQL Server có lưu trữ 29/03/2021 21:35 như trong cơ sở dữ liệu không? Còn về 2021-03-29 thì sao? Chúng có được lưu trữ dưới dạng chuỗi được định dạng không? Dựa trên tài liệu này của Microsoft, nó không giống như thế này.

Ví dụ, hãy lấy kiểu dữ liệu DATE. Nó được lưu trữ dưới dạng số nguyên 3 byte.

Làm sao chúng ta biết?

Vâng, Microsoft cho biết là như vậy nhưng không cung cấp thêm thông tin. Điều đó không có nghĩa là chúng ta không thể biết chắc. Đầu tiên, giá trị tối thiểu của loại dữ liệu DATE là 01/01/0001 hoặc 01/01 CE hoặc Common Era. Để chuyển đổi ngày này thành số nguyên, trước tiên chúng ta chuyển đổi ngày đó thành VARBINARY, như sau:

SELECT CAST(CAST('01/01/0001' AS DATE) AS VARBINARY(3))

Kết quả là 0x000000 ở định dạng thập lục phân. Từ giá trị này, chúng ta có thể thấy rằng giá trị nguyên của ngày 1 tháng 1 năm 1 CE là 0. Điều này hợp lý vì đó là giá trị DATE tối thiểu.

Bây giờ, chúng tôi tạm ứng 1 ngày.

SELECT CAST(CAST('01/02/0001' AS DATE) AS VARBINARY(3))  -- January 2, 1 CE

Kết quả là 0x010000 . Đây là một chút khó khăn, nhưng bài đăng này đã cho chúng tôi một ý tưởng. Chúng ta không thể coi nó như chúng ta thấy. Các byte được đảo ngược và giá trị hex thực tế là 0x000001 . Nếu bạn biết một chút về số hex, bạn sẽ biết rằng con số này bằng 1 - tức là 1 ngày kể từ điểm bắt đầu, ngày 1 tháng 1 năm 1 CN.

Bây giờ, hãy thử một ngày gần đây:29/03/2021.

SELECT CAST(CAST('03/29/2021' AS DATE) AS VARBINARY(3))

Kết quả là 0x55420B . Khi chúng tôi đảo ngược nó, nó sẽ trở thành 0x0B4255 . Lần này, chúng ta không thể biết giá trị bằng cách nhìn vào nó. Vì vậy, chúng tôi nhân nó với 1 dưới dạng số nguyên.

SELECT 0x0B4255 * CAST(1 AS INT)

Kết quả là 737,877 . Đây là số ngày kể từ ngày 1 tháng 1 năm 1 CN. Hãy cùng DATEDIFF xác minh điều đó.

SELECT DATEDIFF(DAY,CAST('01/01/0001' AS DATE),CAST('03/29/2021' AS DATE))

Kết quả giống nhau: 737,877 ngày. Rất tuyệt!

Bottom-line:Ngày được Định dạng Chỉ dành cho Mục đích Trình bày

Đó là cách SQL Server lưu trữ các kiểu dữ liệu DATE. Nó khác với DATETIME, SMALLDATETIME và DATETIME2, nhưng vẫn được lưu trữ dưới dạng số nguyên. SQL Server tính toán khoảng thời gian từ điểm bắt đầu và hiển thị ngày mà tất cả chúng ta có thể hiểu được.

Cho dù bạn đang xem nó trong SQL Server Management Studio, dbForge Studio cho SQL Server hay ứng dụng của bạn, 29/03/2021 chỉ là một bản trình bày. Nếu bạn thay đổi khu vực hoặc ngôn ngữ, giá trị được lưu trữ 0x55420B sẽ vẫn như cũ.

Bây giờ chúng ta biết rằng ngày tháng không được lưu trữ dưới dạng chuỗi. Chúng ta có thể quên việc lưu trữ ngày tháng ở một định dạng cụ thể . Đó không phải là cách nó hoạt động. Thay vào đó, hãy xem xét các cách khác nhau trong SQL để định dạng ngày tháng mà ứng dụng của bạn cần.

4 cách dễ dàng để định dạng ngày

Chúng ta hãy kiểm tra các hàm ngày trong SQL sau:

  • Chức năng CHUYỂN ĐỔI
  • ĐẶT NGÔN NGỮ
  • ĐẶT DATEFORMAT
  • Hàm FORMAT

Bạn cũng có thể sử dụng trình định dạng truy vấn SQL.

1. Chức năng CHUYỂN ĐỔI

CONVERT là một trong những hàm chuyển đổi dữ liệu cũng có thể phục vụ cho việc định dạng ngày tháng. Hình 1 hiển thị một ví dụ.

Hai đối số đầu tiên của CONVERT là kiểu dữ liệu đích và giá trị ngày tháng. Cái thứ ba là tùy chọn nhưng nó cũng áp dụng cho các ngày. Các giá trị số là kiểu định dạng ngày trong SQL để sử dụng trong quá trình chuyển đổi từ ngày thành chuỗi.

Trong Hình 1, Nhật Bản sử dụng định dạng năm-tháng-ngày với dấu gạch chéo làm dấu phân cách. Đức sử dụng ngày-tháng-năm với các dấu chấm làm dấu phân cách. Anh và Pháp sử dụng trình tự tương tự như Đức, nhưng có dấu gạch chéo làm dấu phân cách. Chỉ Hoa Kỳ sử dụng tháng-ngày-năm với dấu gạch nối làm dấu phân tách.

Trong SQL, bạn cũng có thể chuyển đổi biểu thức DATETIME thành DATE.

Để có danh sách đầy đủ các kiểu định dạng ngày CHUYỂN ĐỔI trong SQL, hãy kiểm tra tài liệu tham khảo này từ Microsoft.

2. ĐẶT NGÔN NGỮ

Cài đặt này chỉ định ngôn ngữ được áp dụng cho phiên. Nó ảnh hưởng đến các định dạng ngày tháng và thông báo hệ thống. Khi bạn đặt một ngôn ngữ, bạn cũng hoàn toàn áp dụng các cài đặt ĐẶT DATEFORMAT (chúng tôi sẽ giải quyết sau).

Bây giờ, hãy kiểm tra các ví dụ trong Hình 2. Tôi đang thay đổi cài đặt ngôn ngữ thành tiếng Lithuania, sau đó quay lại tiếng Anh.

Nhìn vào Hình 2. Định dạng ngày của Litva là năm-tháng-ngày. Bất cứ khi nào tôi thử các ngày khác nhau, ngày dài luôn bao gồm ‘m.’ Trước tháng và ‘d.’ Sau ngày. Chữ cái đầu tiên của tháng và tên của ngày trong tuần cũng không được viết hoa. Nó khác với các cài đặt ngôn ngữ khác nhưng bạn hiểu chính xác.

Để biết thêm thông tin về SET LANGUAGE, hãy xem tài liệu tham khảo này từ Microsoft.

3. ĐẶT DATEFORMAT

Cài đặt này đặt thứ tự của tháng, ngày và năm để diễn giải các chuỗi ký tự ngày. Nó sẽ ghi đè các cài đặt định dạng ngày tháng ngầm được thực hiện bởi SET LANGUAGE. Đây là một ví dụ trong Hình 3.

Trong Hình 3, mã sử dụng định dạng DMY hoặc ngày-tháng-năm. Trong các cài đặt này, bất kỳ giá trị ngày nào được đặt thành biến ngày phải tuân theo mẫu này. 30/03/2021 khớp với định dạng này nhưng 31/03/2021 gây ra lỗi vì 31 không phải là tháng hợp lệ.

Do đó, các thay đổi trong định dạng ngày có thể phá vỡ ứng dụng của bạn nếu logic hoạt động dựa trên tiền đề của một định dạng khác.

Để biết thêm thông tin về SET DATEFORMAT, hãy xem tài liệu tham khảo này từ Microsoft.

4. Hàm FORMAT

Trong tất cả các tùy chọn định dạng có sẵn, tùy chọn này là linh hoạt nhất. Nó cũng tương tự đối với định dạng ngày trong .Net, vì FORMAT dựa vào sự hiện diện của .Net Framework trên máy chủ nơi SQL Server được cài đặt. Tuy nhiên, đó là hạn chế của tùy chọn này.

Cũng giống như làm điều đó trong C #, FORMAT nhận một giá trị ngày tháng và một chuỗi định dạng. Hãy xem một vài ví dụ trong Hình 4.

Giống như trong .Net, trong SQL Server, bạn có thể định dạng ngày bằng các dấu phân tách khác nhau. Ngoài ra, bạn có thể định vị tháng, ngày và năm ở bất kỳ đâu. Sau đó, bạn có thể lấy thông tin văn hóa và sử dụng định dạng ngày của nó.

Để biết thêm thông tin và ví dụ về FORMAT, hãy xem tài liệu tham khảo này từ Microsoft.

Bây giờ, chúng tôi đã xác định được 4 cách để định dạng ngày tháng và sự đa dạng của các định dạng ngày tháng. Có định dạng chuẩn nào luôn hoạt động khi chuyển đổi chuỗi thành ngày tháng không?

ISO 8601 - Định dạng ngày SQL di động, không có lỗi nhất mà bạn có thể sử dụng để chuyển đổi

ISO 8601 đã có từ năm 1988. Đây là tiêu chuẩn quốc tế trong việc trao đổi dữ liệu liên quan đến ngày và giờ .

Nó cũng có sẵn trong chức năng CHUYỂN ĐỔI như một trong các kiểu định dạng ngày:kiểu 126 và 127 tuân thủ ISO 8601.

Điều gì làm cho nó di động và không bị lỗi?

Sự cố với các định dạng không phải ISO 8601

Hãy chứng minh sự cố không phải ISO 8601 bằng một ví dụ:

DECLARE @d VARCHAR(10) = '03/09/2021';

SET LANGUAGE Italian;
SELECT FORMAT(CONVERT(DATETIME, @d),'D')
SET LANGUAGE English
SELECT FORMAT(CONVERT(DATETIME, @d),'D')

SET DATEFORMAT DMY
SELECT FORMAT(CONVERT(DATETIME, @d),'D')
SET DATEFORMAT MDY
SELECT FORMAT(CONVERT(DATETIME, @d),'D')

Tùy thuộc vào ngôn ngữ ngày của bạn, bạn có thể diễn giải @d là ngày 9 tháng 3 năm 2021 hoặc ngày 3 tháng 9 năm 2021. Bạn không thể chắc chắn đó là ngày nào. Đó là nguyên nhân của vấn đề.

Kiểm tra kết quả trong Hình 5 bên dưới:

Ngay cả SQL Server cũng không biết chắc chắn điều đó!

Tệ nhất, loại kịch bản này có thể phá vỡ ứng dụng của bạn giống như những gì đã xảy ra trong Hình 3 trước đó. Tình huống này là vấn đề đối với các ứng dụng giao dịch với người dùng đa văn hóa.

ISO 8601 có thể trợ giúp điều này không?

Sử dụng ISO 8601 để giải quyết các vấn đề về định dạng

Lưu ý khi định dạng ISO 8601 yyyyMMdd được sử dụng thay vì MM / dd / yyyy và kiểm tra kết quả trong Hình 6:

Nó sẽ luôn là ngày 9 tháng 3, bất kể cài đặt định dạng ngày và ngôn ngữ nào được sử dụng. Điều này rất tốt cho việc trao đổi dữ liệu và tích hợp hệ thống. Nếu người dùng của bạn có định dạng ngày khác trong đài, điều đó cũng không thành vấn đề.

Nếu bạn cần chuyển đổi ngày tháng của mình thành chuỗi và ngược lại, hãy sử dụng ISO 8601.

ISO 8601 trong SQL Server có 2 loại:

  • YYYYMMDD chỉ dành cho ngày tháng.
  • YYYY-MM-DDTHH:MM:SS cho kết hợp ngày và giờ, trong đó T là dấu phân cách giữa ngày và giờ.

Các cách khác để xử lý các định dạng ngày từ Ứng dụng sang SQL Server

1. Sử dụng Kiểm soát Nhận biết Ngày tháng trong Ứng dụng

Khi bạn yêu cầu người dùng nhập ngày tháng vào biểu mẫu, đừng để họ sử dụng văn bản tự do. Sử dụng các kiểm soát ngày tháng chỉ cho phép chọn từ các giá trị hợp lệ.

2. Chỉ chuyển đổi sang định dạng khác khi cần thiết

Đừng tiếp tục chuyển đổi ngày tháng thành chuỗi và ngược lại. Sử dụng kiểu dữ liệu Date hoặc DateTime gốc của ứng dụng gọi điện. Nếu bạn cần chuyển đổi chúng vì bất kỳ lý do gì, hãy sử dụng ISO 8601.

3. Đặt Ngày / Giờ, Múi giờ và Văn hóa trong Khởi động ứng dụng của bạn, nếu Có thể áp dụng

Nếu ứng dụng của bạn sử dụng định dạng ngày cố định và người dùng của bạn thích chỉnh sửa định dạng ngày, bạn có thể sửa cả hai khi khởi động ứng dụng. Đặt rõ ràng những gì ứng dụng của bạn cần. Sẽ tốt hơn nhiều nếu quản trị viên mạng của bạn có thể khóa các cài đặt này.

Bài học rút ra

Vì vậy, việc xử lý các loại định dạng ngày SQL có áp đảo không? Tôi không thể trách bạn nếu bạn vẫn thấy như vậy, nhưng chúng tôi phát hiện ra rằng điều đó không phải là không thể.

Đây là những gì chúng tôi đã đề cập:

  • Ngày tháng trong SQL được lưu trữ dưới dạng số nguyên . Những gì chúng ta nhìn thấy bằng mắt thường đã được định dạng dựa trên cài đặt SQL Server. Cho dù chúng tôi thay đổi ngôn ngữ và định dạng ngày bao nhiêu lần, giá trị được lưu trữ sẽ vẫn như cũ. Thật vô ích khi nghĩ đến việc lưu trữ ngày tháng ở một định dạng cụ thể.
  • Có 4 cách để định dạng ngày: CHUYỂN ĐỔI , ĐẶT NGÔN NGỮ , ĐẶT DATEFORMAT ĐỊNH DẠNG .
  • Nếu bạn cần chuyển đổi ngày tháng thành chuỗi và ngược lại, hãy sử dụng định dạng ISO 8601 .
  • Có 3 cách khác để xử lý các định dạng ngày:
    • sử dụng các kiểm soát nhận biết ngày tháng trong ứng dụng của bạn;
    • chỉ chuyển đổi ngày thành chuỗi khi cần thiết ;
    • đặt múi giờ, văn hóa, ngày / giờ máy chủ được yêu cầu khi khởi động khi có thể .

Bạn có nghĩ rằng điều này sẽ hữu ích cho bạn và cho những người khác? Sau đó, vui lòng chia sẻ bài viết này trên các nền tảng mạng xã hội yêu thích của bạn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tham gia với chúng tôi ở Las Vegas để có SQLintersection và tiết kiệm $ 100

  2. Thiết kế Cơ sở dữ liệu cho Cổng Thông tin Việc làm Trực tuyến

  3. Ước tính mật độ:Kết hợp thống kê mật độ

  4. Thực hiện phương pháp tiếp cận của con người để quản trị dữ liệu

  5. Các blog cơ sở dữ liệu hàng đầu để theo dõi