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

Cài đặt ngôn ngữ có thể ảnh hưởng đến kết quả FORMAT () của bạn như thế nào trong SQL Server (Ví dụ T-SQL)

Có thể dễ dàng quên rằng T-SQL FORMAT() chức năng cung cấp định dạng nhận biết ngôn ngữ. Nhận biết ngôn ngữ có nghĩa là ngôn ngữ có thể ảnh hưởng đến kết quả. Nói cách khác, kết quả chính xác bạn nhận được sẽ phụ thuộc vào ngôn ngữ.

Theo mặc định, hàm sử dụng ngôn ngữ của phiên hiện tại để xác định ngôn ngữ. Tuy nhiên, điều này có thể được ghi đè bằng cách chuyển đối số "culture" vào hàm. Làm điều này cho phép bạn cung cấp kết quả cho một ngôn ngữ cụ thể mà không cần phải thay đổi ngôn ngữ của phiên hiện tại.

Bài viết này chứa các ví dụ về cách ngôn ngữ có thể ảnh hưởng đến kết quả khi sử dụng FORMAT() trong SQL Server.

Ví dụ 1 - Đơn vị tiền tệ

Dưới đây là một ví dụ nhanh để chứng minh cách ngôn ngữ / văn hóa có thể ảnh hưởng đến kết quả của bạn khi định dạng số.

 DECLARE @num decimal (6,2) =1234,56; CHỌN ĐỊNH DẠNG (@num, 'C', 'en-us') 'en-us', ĐỊNH DẠNG (@num, 'C', 'en-gb ')' en-gb ', FORMAT (@num,' C ',' th-th ')' th-th ', FORMAT (@num,' C ',' nl-nl ')' nl-nl ', ĐỊNH DẠNG (@num, 'C', 'ne-np') 'ne-np', ĐỊNH DẠNG (@num, 'C', 'fa-ir') 'fa-ir'; 

Kết quả:

 + ----------- + ----------- + ----------- + ---------- - + ------------ + -------------- + | vi chúng tôi | en-gb | th-th | nl-nl | ne-np | fa-ir || ----------- + ----------- + ----------- + --------- --- + ------------ + -------------- || 1.234,56 USD | 1.234,56 bảng Anh | ฿ 1.234,56 | € 1,234,56 | रु 1.234,56 | 1,234/56 ريال | + ----------- + ----------- + ----------- + --------- --- + ------------ + -------------- + 

C trong ví dụ này là một định dạng số tiêu chuẩn. Ký tự đơn này chỉ định rằng giá trị phải được định dạng theo một cách nhất định (trong trường hợp này là một đơn vị tiền tệ). May mắn thay, SQL Server đủ thông minh để biết rằng không phải tất cả các nền văn hóa đều sử dụng cùng một định dạng và nó tự động đưa ra một định dạng khác tùy thuộc vào nền văn hóa.

Trong ví dụ trên, mỗi lần tôi gọi FORMAT() , Tôi chuyển cùng một giá trị và chuỗi định dạng. Sự khác biệt duy nhất là giá trị của lập luận văn hóa. Điều này làm cho các kết quả khác nhau, tùy thuộc vào nền văn hóa được sử dụng. Biểu tượng tiền tệ và vị trí của nó được xác định bởi nền văn hóa. Ký tự được sử dụng cho dấu phân tách thập phân và dấu phân tách nhóm cũng được xác định bởi văn hóa.

Ví dụ 2 - Giá trị phủ định

Định dạng cũng có thể phụ thuộc vào việc giá trị là dương hay âm. Nếu chúng tôi sử dụng giá trị âm, đây là điều sẽ xảy ra:

 DECLARE @num decimal (3,2) =-1,23; CHỌN ĐỊNH DẠNG (@num, 'C', 'en-us') 'en-us', ĐỊNH DẠNG (@num, 'C', 'en- gb ')' en-gb ', FORMAT (@num,' C ',' th-th ')' th-th ', FORMAT (@num,' C ',' nl-nl ')' nl-nl ' , ĐỊNH DẠNG (@num, 'C', 'ne-np') 'ne-np', ĐỊNH DẠNG (@num, 'C', 'fa-ir') 'fa-ir'; 

Kết quả:

 + --------- + --------- + --------- + --------- + ------ --- + ----------- + | vi chúng tôi | en-gb | th-th | nl-nl | ne-np | fa-ir || --------- + --------- + --------- + --------- + ----- ---- + ----------- || ($ 1,23) | - 1,23 bảng Anh | - ฿ 1,23 | € -1,23 | -रु 1,23 | 1/23-ريال | + --------- + --------- + --------- + --------- + --- ------ + ----------- + 

Ở một số nền văn hóa, dấu trừ xuất hiện trước ký hiệu tiền tệ, ở một số nền văn hóa khác, dấu trừ xuất hiện sau nó. Nhưng ở các nền văn hóa khác, không có dấu trừ nào cả - nó được thay thế bằng dấu ngoặc đơn bao quanh toàn bộ kết quả, bao gồm cả ký hiệu tiền tệ.

Tuy nhiên, chúng ta không nên cho rằng các quy tắc giống nhau được áp dụng cho tất cả các chuỗi định dạng. Ví dụ:nếu chúng tôi định dạng nó là một số thay vì một đơn vị tiền tệ, chúng tôi sẽ không nhận được bất kỳ dấu ngoặc đơn nào:

 DECLARE @num decimal (3,2) =-1,23; CHỌN ĐỊNH DẠNG (@num, 'N', 'en-us') 'en-us', ĐỊNH DẠNG (@num, 'N', 'en- gb ')' en-gb ', FORMAT (@num,' N ',' th-th ')' th-th ', FORMAT (@num,' N ',' nl-nl ')' nl-nl ' , ĐỊNH DẠNG (@num, 'N', 'ne-np') 'ne-np', ĐỊNH DẠNG (@num, 'N', 'fa-ir') 'fa-ir'; 

Kết quả:

 + --------- + --------- + --------- + --------- + ------ --- + --------- + | vi chúng tôi | en-gb | th-th | nl-nl | ne-np | fa-ir || --------- + --------- + --------- + --------- + ----- ---- + --------- || -1,23 | -1,23 | -1,23 | -1,23 | -1,23 | 1 / 23- | + --------- + --------- + --------- + --------- + ---- ----- + --------- + 

Ví dụ 3 - Ngày và Giờ

Định dạng số không phải là thứ duy nhất bị ảnh hưởng bởi văn hóa. Ví dụ:ngày và giờ cũng sẽ được định dạng khác nhau tùy thuộc vào nền văn hóa.

 DECLARE @date datetime2 (0) ='2019-06-15 13:45:30'; CHỌN ĐỊNH DẠNG (@date, 'G', 'en-us') 'en-us', ĐỊNH DẠNG (@date , 'G', 'en-gb') 'en-gb', FORMAT (@date, 'G', 'th-th') 'th-th', FORMAT (@date, 'G', 'nl- nl ')' nl-nl ', FORMAT (@date,' G ',' ne-np ')' ne-np ', FORMAT (@date,' G ',' fa-ir ')' fa-ir '; 

Kết quả (sử dụng đầu ra dọc):

 vi chúng tôi | 15/6/2019 1:45:30 PMen-gb | 15/06/2019 13:45:30-th | 15/6/2562 13:45:30nl-nl | 15-6-2019 13:45:30ne-np | 15/6/2019 1:45:30 अपराह्न fa-ir | 25/03/1398 01:45:30 ب.ظ 

Ví dụ này sử dụng định dạng ngày / thời gian chung (đạt được bằng cách sử dụng G - một trong những định dạng ngày và giờ chuẩn) và sự khác biệt giữa các nền văn hóa là rõ ràng.

Nhưng chúng ta cũng có thể thấy sự khác biệt ngay cả khi sử dụng định dạng ngày dài:

 DECLARE @date datetime2 (0) ='2019-06-15 13:45:30'; CHỌN ĐỊNH DẠNG (@date, 'F', 'en-us') 'en-us', ĐỊNH DẠNG (@date , 'F', 'en-gb') 'en-gb', FORMAT (@date, 'F', 'th-th') 'th-th', FORMAT (@date, 'F', 'nl- nl ')' nl-nl ', FORMAT (@date,' F ',' ne-np ')' ne-np ', FORMAT (@date,' F ',' fa-ir ')' fa-ir '; 

Kết quả (sử dụng đầu ra dọc):

 vi chúng tôi | Thứ bảy, ngày 15 tháng 6 năm 2019 1:45:30 PMen-gb | 15 tháng 6 năm 2019 13:45:30-th | 15 มิถุนายน 2562 13:45:30nl-nl | zaterdag 15 tháng sáu 2019 13:45:30ne-np | शनिवार, जून 15, 2019 1:45:30 अपराह्न fa-ir | شنبه, 25 خرداد 1398 01:45:30 ب.ظ 

Ví dụ 4 - Còn về Chuỗi định dạng tùy chỉnh thì sao?

Các ví dụ trước sử dụng chuỗi định dạng tiêu chuẩn, điều này giúp bạn định dạng khá nhiều. Nó giống như một cách viết tắt để chỉ định một chuỗi định dạng tùy chỉnh. Mặt khác, công cụ định dạng tùy chỉnh cho phép bạn chỉ định chính xác những ký tự xuất hiện trong đầu ra và vị trí của chúng. Tuy nhiên, điều này thường có nghĩa là bạn cần sử dụng nhiều mã định dạng hơn trong chuỗi định dạng của mình.

Nhưng ngay cả khi bạn sử dụng các chỉ định định dạng tùy chỉnh, đầu ra chính xác cũng có thể phụ thuộc vào ngôn ngữ. Nếu chúng tôi muốn sử dụng chuỗi định dạng ngày và giờ tùy chỉnh để bắt chước ví dụ trước, chúng tôi có thể làm như sau:

 DECLARE @date datetime2 (0) ='2019-06-15 13:45:30'; CHỌN ĐỊNH DẠNG (@date, 'dddd, dd MMMM yyyy hh:mm:ss tt', 'en-us') 'en-us', FORMAT (@date, 'dddd, dd MMMM yyyy hh:mm:ss tt', 'en-gb') 'en-gb', FORMAT (@date, 'dddd, dd MMMM yyyy hh:mm:ss tt ',' th-th ')' th-th ', ĐỊNH DẠNG (@date,' dddd, dd MMMM yyyy hh:mm:ss tt ',' nl-nl ')' nl-nl ', ĐỊNH DẠNG (@date, 'dddd, dd MMMM yyyy hh:mm:ss tt', 'ne-np') 'ne-np', FORMAT (@date, 'dddd, dd MMMM yyyy hh:mm:ss tt', ' fa-ir ')' fa-ir '; 

Kết quả (sử dụng đầu ra dọc):

 vi chúng tôi | Thứ bảy, ngày 15 tháng 6 năm 2019 01:45:30 PMen-gb | Thứ bảy, ngày 15 tháng 6 năm 2019 01:45:30 PMth-th | เสาร์, 15 มิถุนายน 2562 01:45:30 PMnl-nl | zaterdag, ngày 15 tháng 6 năm 2019 01:45:30 ne-np | शनिवार, 15 जून 2019 01:45:30 अपराह्न fa-ir | شنبه, 25 خرداد 1398 01:45:30 ب.ظ 

Có lẽ quan sát rõ ràng nhất là kết quả được định dạng bằng cách sử dụng ngôn ngữ của miền địa phương được chỉ định. Nhưng nếu chúng ta xem xét kỹ hơn, chúng ta có thể thấy rằng nó cũng bỏ qua bộ chỉ định AM / PM (tt ) cho nl-nl văn hóa, có thể là bởi vì nền văn hóa đó thường sử dụng đồng hồ 24 giờ. Chúng tôi cũng có thể thấy rằng ngay cả định vị của chúng tôi cũng có thể bị bỏ qua trong một số trường hợp (ví dụ:fa-ir ).

Tuy nhiên, không phải mọi thứ đều bị bỏ qua và do đó, chúng tôi kết hợp với sự kết hợp giữa các thông số kỹ thuật rõ ràng của chúng tôi và các thông số kỹ thuật được xác định bởi ngôn ngữ.

Tìm / Thay đổi Ngôn ngữ Hiện tại của bạn

Như đã đề cập, nếu bạn không cung cấp đối số "văn hóa", ngôn ngữ của phiên hiện tại của bạn sẽ được sử dụng để xác định ngôn ngữ.

Có một số cách để tìm ngôn ngữ của phiên hiện tại của bạn.

Bạn cũng có thể thay đổi ngôn ngữ của kết nối hiện tại của mình.

Ngoài ra, bạn có thể chỉ cần sử dụng SET LANGUAGE để chuyển đổi ngôn ngữ hiện tại theo yêu cầu.

Dưới đây là một ví dụ nhanh về cách sử dụng SET LANGUAGE để cho thấy rằng cài đặt ngôn ngữ của riêng bạn có thể ảnh hưởng đến kết quả định dạng giống như khi bạn sử dụng đối số "culture", như trong các ví dụ trước.

 DECLARE @num decimal (3,2) =-1,23; ĐẶT NGÔN NGỮ Anh; CHỌN ĐỊNH DẠNG (@num, 'C') Kết quả; ĐẶT NGÔN NGỮ US_English; CHỌN ĐỊNH DẠNG (@num, 'C') Kết quả;  

Kết quả:

 + ---------- + | Kết quả || ---------- || - £ 1,23 | + ---------- ++ ---------- + | Kết quả || ---------- || ($ 1,23) | + ---------- + 

  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ú pháp không chính xác gần ')' gọi thủ tục được lưu trữ với GETDATE

  2. Xóa danh tính khỏi một cột trong bảng

  3. Cách đặt giá trị bool trong SQL

  4. Thiết kế cơ sở dữ liệu cho cài đặt người dùng

  5. Cài đặt ngôn ngữ có thể ảnh hưởng đến kết quả FORMAT () của bạn như thế nào trong SQL Server (Ví dụ T-SQL)