Trong bài viết này, chúng ta sẽ khám phá cách sử dụng các định dạng ngày CHUYỂN ĐỔI SQL khác nhau trong SQL Server.
Việc giải thích ngày tháng khác nhau giữa các quốc gia khác nhau. Giả sử bạn có một cơ sở dữ liệu SQL Server toàn cầu với một bảng chứa một định dạng ngày cụ thể. Ví dụ:nó có một cột ngày có giá trị 01/05/2020.
Làm thế nào để bạn giải thích nó? Hãy xem các diễn giải sau ở các quốc gia khác nhau.
- Hoa Kỳ:Ngày 5 tháng 1 năm 2020 (Định dạng chuẩn - mm / dd / yyyy)
- Châu Âu:ngày 1 tháng 5 năm 2020 (Định dạng chuẩn - dd / mm / yyyy)
Ngoài ra, các quốc gia khác tuân theo các định dạng ngày khác nhau:
- Thổ Nhĩ Kỳ:dd.mm.yyyy
- Ấn Độ:dd-mm-yyyy
- Bungari:yyyy-m-d
- Hungary:yyyy.mm.dd.
Bạn có thể tham khảo Wikipedia để biết thêm thông tin về các định dạng ngày tháng theo quốc gia.
Ngoài ra, đôi khi chúng tôi cũng muốn bao gồm dấu thời gian cùng với ngày tháng. Một vài ví dụ về điều này là:
- 01/05/2020 10:00 SA
- 0/05/2020 14:00
- 0/05/2020 02:00 CH
- 01/05/2020 02:00:55 AM
Không thể lưu trữ ngày tháng trong bảng SQL Server ở các định dạng khác nhau, vì vậy chúng tôi cần một cách để chuyển đổi định dạng ngày tháng. Hãy cùng khám phá các phương pháp định dạng ngày CHUYỂN ĐỔI SQL khác nhau.
Hàm ngày CHUYỂN ĐỔI trong SQL
Thông thường, các chuyên gia cơ sở dữ liệu sử dụng chức năng CHUYỂN ĐỔI ngày tháng trong SQL để đưa ngày tháng vào một định dạng nhất định và cụ thể. Điều này áp dụng mã kiểu cho các ngày đầu ra cụ thể.
Cú pháp của hàm CONVERT ():
CHUYỂN ĐỔI (kiểu dữ liệu, ngày giờ [, kiểu])
Trong truy vấn SQL dưới đây, chúng tôi chuyển đổi ngày giờ thành hai định dạng bằng cách sử dụng hàm CONVERT ().
- Định dạng mm / dd / yy:mã kiểu 1
- Định dạng mm / dd / yyyy:mã kiểu 101
DECLARE @Inputdate datetime = '2019-12-31 14:43:35.863'; Select CONVERT(varchar,@Inputdate,1) as [mm/dd/yy], CONVERT(varchar,@Inputdate,101) as [mm/dd/yyyy]
Tương tự, chúng tôi có thể chỉ định các mã kiểu khác nhau để bạn có thể chuyển đổi ngày tháng sang định dạng bạn yêu cầu.
SELECT '0' AS [StyleCode], 'Default format' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 0) AS [OutputFormat] UNION ALL SELECT '1' AS [StyleCode], 'USA - mm/dd/yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 1) AS [OutputFormat] UNION ALL SELECT '2' AS [StyleCode], 'ANSI - dd.mm.yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 2) AS [OutputFormat] UNION ALL SELECT '3' AS [StyleCode], 'British and French - dd/mm/yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 3) AS [OutputFormat] UNION ALL SELECT '4' AS [StyleCode], 'German - dd.mm.yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 4) AS [OutputFormat] UNION ALL SELECT '5' AS [StyleCode], 'Italian - dd-mm-yy ' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 5) AS [OutputFormat] UNION ALL SELECT '6' AS [StyleCode], 'Shortened month name -dd mon yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 6) AS [OutputFormat] UNION ALL SELECT '7' AS [StyleCode], 'Shortened month name - mon dd, yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 7) AS [OutputFormat] UNION ALL SELECT '8' AS [StyleCode], '24 hour time -hh:mm:ss' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 8) AS [OutputFormat] UNION ALL SELECT '9' AS [StyleCode], 'Default + milliseconds - mon dd yyyy hh:mm:ss:mmmAM (or PM)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 9) AS [OutputFormat] UNION ALL SELECT '10' AS [StyleCode], 'USA - mm-dd-yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 10) AS [OutputFormat] UNION ALL SELECT '11' AS [StyleCode], 'Japan -yy/mm/dd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 11) AS [OutputFormat] UNION ALL SELECT '12' AS [StyleCode], 'ISO format -yymmdd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 12) AS [OutputFormat] UNION ALL SELECT '13' AS [StyleCode], 'Europe default + milliseconds -dd mon yyyy hh:mm:ss:mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 13) AS [OutputFormat] UNION ALL SELECT '14' AS [StyleCode], ' 24 hour time with milliseconds -hh:mm:ss:mmm(24h)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 14) AS [OutputFormat] UNION ALL SELECT '20' AS [StyleCode], 'ODBC canonical -yyyy-mm-dd hh:mm:ss(24h)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 20) AS [OutputFormat] UNION ALL SELECT '21' AS [StyleCode], 'ODBC canonical (with milliseconds) -yyyy-mm-dd hh:mm:ss.mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 21) AS [OutputFormat] UNION ALL SELECT '22' AS [StyleCode], 'mm/dd/yy hh:mm:ss AM (or PM)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 22) AS [OutputFormat] UNION ALL SELECT '23' AS [StyleCode], 'ISO 8601 - yyyy-mm-dd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 23) AS [OutputFormat] UNION ALL SELECT '100' AS [StyleCode], 'mon dd yyyy hh:mmAM' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 100) AS [OutputFormat] UNION ALL SELECT '101' AS [StyleCode], 'USA -mm/dd/yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 101) AS [OutputFormat] UNION ALL SELECT '102' AS [StyleCode], 'ANSI -yyyy.mm.dd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 102) AS [OutputFormat] UNION ALL SELECT '103' AS [StyleCode], 'British/French -dd/mm/yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 103) AS [OutputFormat] UNION ALL SELECT '104' AS [StyleCode], 'German - dd.mm.yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 104) AS [OutputFormat] UNION ALL SELECT '105' AS [StyleCode], 'Italian -dd-mm-yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 105) AS [OutputFormat] UNION ALL SELECT '106' AS [StyleCode], 'Shortened month name -dd mon yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 106) AS [OutputFormat] UNION ALL SELECT '107' AS [StyleCode], 'Shortened month name -mon dd, yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 107) AS [OutputFormat] UNION ALL SELECT '108' AS [StyleCode], '24 hour time -hh:mm:ss' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 108) AS [OutputFormat] UNION ALL SELECT '109' AS [StyleCode], 'Default + milliseconds -mon dd yyyy hh:mm:ss:mmmAM (or PM) ' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 109) AS [OutputFormat] UNION ALL SELECT '110' AS [StyleCode], 'USA -mm-dd-yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 110) AS [OutputFormat] UNION ALL SELECT '111' AS [StyleCode], 'JAPAN -yyyy/mm/dd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 111) AS [OutputFormat] UNION ALL SELECT '112' AS [StyleCode], 'ISO -yyyymmdd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 112) AS [OutputFormat] UNION ALL SELECT '113' AS [StyleCode], 'Europe default + milliseconds -dd mon yyyy hh:mm:ss:mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 113) AS [OutputFormat] UNION ALL SELECT '114' AS [StyleCode], ' 24 hour time with milliseconds -hh:mm:ss:mmm(24h)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 114) AS [OutputFormat] UNION ALL SELECT '120' AS [StyleCode], 'ODBC canonical- yyyy-mm-dd hh:mm:ss(24h)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 120) AS [OutputFormat] UNION ALL SELECT '121' AS [StyleCode], 'ODBC canonical (with milliseconds) -yyyy-mm-dd hh:mm:ss.mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 121) AS [OutputFormat] UNION ALL SELECT '126' AS [StyleCode], 'ISO8601 -yyyy-mm-ddThh:mm:ss.mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 126) AS [OutputFormat] UNION ALL SELECT '127' AS [StyleCode], 'ISO8601 with time zone Z-yyyy-mm-ddThh:mm:ss.mmmZ' AS [Standard and Format], CONVERT(VARCHAR(100), Getdate(), 127) AS [OutputFormat] UNION ALL SELECT '131' AS [StyleCode], 'Arabic Hijri date - Islamic calendar' AS [Standard and Format], CONVERT(VARCHAR(100), Getdate(), 131) AS [OutputFormat]
Trong ảnh chụp màn hình bên dưới, bạn có thể thấy mã kiểu, tiêu chuẩn, định dạng và ngày xuất của chúng.
Chuyển đổi ngày tháng bằng hàm FORMAT ()
Trong hàm CONVERT () ở trên, chúng ta bắt buộc phải chỉ định mã kiểu cho đầu ra định dạng cụ thể. Thông thường, chúng tôi không muốn phải nhớ những mã này; do đó, Microsoft đã giới thiệu hàm FORMAT () trong SQL Server 2012.
Cú pháp được hiển thị bên dưới.
ĐỊNH DẠNG (giá trị, định dạng [, văn hóa])
Giá trị :Nó yêu cầu một giá trị ở định dạng được hỗ trợ. Bạn có thể tham khảo tài liệu của Microsoft để biết danh sách chi tiết.
Định dạng :Trong định dạng, chúng tôi có thể chỉ định mã định dạng hoặc mẫu để che dữ liệu ngày đầu vào. Tập lệnh dưới đây hiển thị mã định dạng, mẫu và định dạng đầu ra.
DECLARE @InputDate DATETIME = '2020-12-08 15:58:17.643' SELECT 'd' AS [FormatCode], 'Short Date Pattern' AS 'Pattern', Format(@InputDate, 'd') AS 'Output' UNION ALL SELECT 'D' AS [FormatCode], 'Long Date Pattern' AS 'Pattern', Format(@InputDate, 'D') AS 'Output' UNION ALL SELECT 'f' AS [FormatCode], 'Full Date/Time pattern (Short Time)' AS 'Pattern', Format(@InputDate, 'f') AS 'Output' UNION ALL SELECT 'F' AS [FormatCode], 'Full Date/Time pattern (Long Time)' AS 'Pattern', Format(@InputDate, 'F') UNION ALL SELECT 'g' AS [FormatCode], 'General Date/Time pattern (Short Time)' AS 'Pattern', Format(@InputDate, 'g') UNION ALL SELECT 'G' AS [FormatCode], 'General Date/Time pattern (Long Time)' AS 'Pattern', Format(@InputDate, 'G') AS 'Output' UNION ALL SELECT 'm' AS [FormatCode], 'Month/Day pattern' AS 'Pattern', Format(@InputDate, 'm') AS 'Output' UNION ALL SELECT 'O' AS [FormatCode], 'Round trip Date/Time pattern' AS 'Pattern', Format(@InputDate, 'O') AS 'Output' UNION ALL SELECT 'R' AS [FormatCode], 'RFC1123 pattern' AS 'Pattern', Format(@InputDate, 'R') AS 'Output' UNION ALL SELECT 's' AS [FormatCode], 'Sortable Date/Time pattern' AS 'Pattern', Format(@InputDate, 's') AS 'Output' UNION ALL SELECT 't' AS [FormatCode], 'Short Time pattern' AS 'Pattern', Format(@InputDate, 't') AS 'Output' UNION ALL SELECT 'T' AS [FormatCode], 'Long Time Pattern' AS 'Pattern', Format(@InputDate, 'T') AS 'Output' UNION ALL SELECT 'u' AS [FormatCode], 'Universal sortable Date/Time pattern' AS 'Pattern', Format(@InputDate, 'u') AS 'Output' UNION ALL SELECT 'U' AS [FormatCode], 'Universal Full Date/Time pattern' AS 'Pattern', Format(@InputDate, 'U') AS 'Output' UNION ALL SELECT 'Y' AS [FormatCode], 'Year Month pattern' AS 'Pattern', Format(@InputDate, 'Y') AS 'Output'
Văn hóa :Nó là một đối số tùy chọn và xác định văn hóa. Nếu chúng tôi không chỉ định bất kỳ văn hóa nào, SQL Server sẽ sử dụng ngôn ngữ của phiên hiện tại.
Trong truy vấn dưới đây, chúng tôi sẽ chuyển đổi một định dạng ngày tháng thành một nền văn hóa cụ thể. Chúng ta cần xác định mã nuôi cấy. Ví dụ:mã văn hóa cho Hoa Kỳ là en-US và hi-IN là cho Ấn Độ.
Các tập lệnh sử dụng d mã định dạng cho các mẫu ngày ngắn.
DECLARE @d DATETIME ='2020-12-08 16:36:17.760'; SELECT FORMAT (@d, 'd', 'en-US') AS 'US English', FORMAT (@d, 'd', 'no') AS 'Norwegian Result', FORMAT(@d, 'd', 'hi-IN') AS 'India', FORMAT(@d, 'd', 'ru-RU') AS 'Russian', FORMAT(@d, 'd', 'gl-ES') AS 'Galician (Spain)', FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English', FORMAT (@d, 'd', 'zu') AS 'Zulu', FORMAT ( @d, 'd', 'de-de' ) AS 'German', FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC)';
Bạn nhận được định dạng ngày tháng trong một nền văn hóa cụ thể, như được hiển thị bên dưới.
Nếu bạn muốn đầu ra ngày ở dạng ngày / giờ (thời gian dài) đầy đủ, hãy chỉ định mã định dạng F và mã này nhanh chóng thay đổi định dạng ngày của bạn.
Trong định dạng ngày, bạn cũng có thể chỉ định các định dạng tùy chỉnh và nó chuyển đổi chuỗi ngày đầu vào theo yêu cầu của bạn.
Để chỉ định các chuỗi tùy chỉnh, chúng ta có thể sử dụng các từ viết tắt sau.
- dd:Ngày trong tháng (01 đến 31)
- dddd:đánh vần ngày
- MM:Số tháng (01 đến 12)
- MMMM:Chính tả tháng
- yy:Năm có hai chữ số
- yyyy:Năm bốn chữ số
- hh:Đó là giờ từ ngày 01 đến ngày 12
- HH:Nó kéo dài 24 giờ. định dạng giờ 00 đến 23
- mm:phút 00 đến phút 59
- ss:thứ hai từ 00 đến 59
- tt:SA hoặc CH
Trong tập lệnh dưới đây, chúng tôi đã chuyển đổi các định dạng ngày đầu vào thành nhiều định dạng bằng cách sử dụng các từ viết tắt hoặc mã ở trên.
DECLARE @d DATETIME ='2020-12-08 16:36:17.760'; SELECT FORMAT (@d,'dd/MM/yyyy ') as [Date Format 1] , FORMAT (@d, 'dd/MM/yyyy, hh:mm:ss ') as [Date Format 2] , FORMAT(@d,'yyyy-MM-dd HH:mm:ss')as [Date Format 3] , FORMAT(@d,'Dd MMM yyyy HH:mm:ss')as [Date Format 4] , FORMAT(@d,'MMM d yyyy h:mm:ss')as [Date Format 5] , FORMAT (@d, 'dddd, MMMM, yyyy')as [Date Format 6] , FORMAT (@d, 'MMM dd yyyy') as [Date Format 7] , FORMAT (@d, 'MM.dd.yy') as [Date Format 8] , FORMAT (@d, 'MM-dd-yy') as [Date Format 9] , FORMAT (@d, 'hh:mm:ss tt')as [Date Format 10] , FORMAT (@d, 'd-M-yy')as [Date Format 11] , FORMAT(@d,'MMMM dd,yyyy')as [Date Format 12]
Sử dụng AT TIME ZONE trong SQL Server 2016 trở lên
Các quốc gia khác nhau tuân theo các múi giờ khác nhau. Thông thường, các múi giờ này tuân theo độ lệch so với giờ Giờ Phối hợp Quốc tế (UTC). Một vài ví dụ về múi giờ là:
- Giờ ban ngày Trung tâm Úc:UTC +10:30
- Giờ chuẩn Ấn Độ:UTC +5:30
- Giờ ban ngày miền núi:UTC-6
- Giờ Singapore:UTC + 8
- Giờ ban ngày miền Trung:UTC-5
Bạn có thể tham khảo bài viết này để biết danh sách chi tiết về múi giờ.
Nhiều quốc gia tuân theo chế độ tiết kiệm ánh sáng ban ngày và đồng hồ được điều chỉnh 1 giờ (hoặc 30-45 phút) tùy thuộc vào múi giờ. Ví dụ:Giờ ban ngày ở miền Trung tuân theo lịch trình bên dưới:
- Giờ Chuẩn bắt đầu:02:00 giờ địa phương ngày 1 tháng 11 năm 2020. Đồng hồ đã quay ngược lại một giờ.
- Giờ Chuẩn kết thúc vào ngày 14 tháng 3 năm 2021, 02:00 giờ địa phương. Đồng hồ sẽ trôi qua sau một giờ.
SQL Server không biết về các múi giờ này và tiết kiệm ánh sáng ban ngày. Thông thường, một tổ chức tuân theo các vùng UTC vì nó không yêu cầu bất kỳ thay đổi nào.
Làm cách nào chúng ta có thể chuyển đổi múi giờ trong SQL Server?
Bạn có thể sử dụng AT TIME ZONE bắt đầu từ SQL Server 2016 và chuyển đổi múi giờ. Trong truy vấn bên dưới, nó hiển thị ngày cho Giờ chuẩn miền Trung, Giờ chuẩn Ấn Độ và Giờ chuẩn Samoa.
Declare @DateinUTC datetime2='2020-11-01 02:00:00' select @DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'Central Standard Time' as 'Central Standard Time' , @DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'India Standard Time' as 'India Standard Time', @DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'Samoa Standard Time' as 'Samoa Standard Time', @DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'Dateline Standard Time' as 'Dateline Standard Time'
Để biết múi giờ được hỗ trợ, bạn có thể truy vấn sys.time_zone_info và nó trả về múi giờ và độ lệch.
Sau đó, bạn có thể lọc các múi giờ hiện đang tuân thủ theo tiết kiệm ánh sáng ban ngày.
Select * from sys.time_zone_info where is_currently_dst=1
Bây giờ, hãy xem xét tiết kiệm ánh sáng ban ngày cho Giờ Phương Đông.
- Giờ tiết kiệm ánh sáng ban ngày đã bắt đầu - Chủ nhật, ngày 8 tháng 3 năm 2020 lúc 2:00 sáng.
- Giờ Tiết kiệm ánh sáng ban ngày đã kết thúc- Chủ nhật, ngày 1 tháng 11 năm 2020, lúc 2:00 sáng.
Chuyển đổi múi giờ UTC của bạn thành Giờ chuẩn miền Đông và bạn có thể ghi nhận tác động của việc tiết kiệm ánh sáng ban ngày.
DECLARE @PreDST datetime = '2020-03-08 06:59:00', @PostDST datetime = '2020-03-08 07:00:00'; SELECT @PreDST AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time' AS [EST time before DST], @PostDST AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time' AS [EST time before DST];
Những điểm hữu ích khi sử dụng định dạng ngày CHUYỂN ĐỔI trong SQL
Đánh giá các yêu cầu ứng dụng của bạn và chọn ngày loại dữ liệu thích hợp, SmallDateTime, DateTime, DateTime2 và DateTimeOffset.
Bạn có thể chuyển đổi định dạng ngày tháng bằng cách sử dụng các hàm CHUYỂN ĐỔI ngày và định dạng trong SQL; tuy nhiên, bạn nên sử dụng định dạng phù hợp nhất với khối lượng công việc của bạn. Điều này sẽ giúp bạn tránh phải sử dụng chuyển đổi ngày rõ ràng.
Bạn có thể tính toán việc tiết kiệm ánh sáng ban ngày trong SQL Server bằng cách sử dụng hàm AT TIME ZONE bắt đầu từ SQL