Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana Pengaturan Bahasa dapat Mempengaruhi Hasil FORMAT() Anda di SQL Server (Contoh T-SQL)

Sangat mudah untuk melupakan bahwa T-SQL FORMAT() fungsi menyediakan pemformatan sadar-lokal. Lokal-aware berarti bahwa lokal dapat mempengaruhi hasil. Dengan kata lain, output persis yang Anda dapatkan akan bergantung pada lokal.

Secara default, fungsi menggunakan bahasa sesi saat ini untuk menentukan lokal. Namun, ini dapat ditimpa dengan meneruskan argumen "budaya" ke fungsi. Melakukan hal ini memungkinkan Anda memberikan hasil untuk lokal tertentu tanpa harus mengubah bahasa sesi saat ini.

Artikel ini berisi contoh bagaimana lokal dapat memengaruhi hasil saat menggunakan FORMAT() fungsi di SQL Server.

Contoh 1 – Mata Uang

Berikut adalah contoh singkat untuk menunjukkan bagaimana bahasa/budaya dapat memengaruhi hasil Anda saat memformat angka.

DECLARE @num desimal(6,2) =1234.56;PILIH FORMAT(@num, 'C', 'en-us') 'en-us', FORMAT(@num, 'C', 'en-gb ') 'en-gb', FORMAT(@num, 'C', 'th-th') 'th-th', FORMAT(@num, 'C', 'nl-nl') 'nl-nl', FORMAT(@num, 'C', 'ne-np') 'ne-np', FORMAT(@num, 'C', 'fa-ir') 'fa-ir';

Hasil:

+-----------+-----------+-----------+---------- --+------------+-------------+| id-kita | id-gb | ke-th | nl-nl | ne-np | fa-ir ||------------+------------+-----------+--------- ---+------------+--------------|| $1,234.56 | £1.234,56 | 1,234.56 | € 1.234,56 | 1,234.56 | 1,234/56ريال |+-----------+-----------+-----------+-------- ---+------------+--------------+

C dalam contoh ini adalah penentu format numerik standar. Karakter tunggal ini menentukan bahwa nilai harus diformat dengan cara tertentu (dalam hal ini, sebagai mata uang). Untungnya, SQL Server cukup pintar untuk mengetahui bahwa tidak semua budaya menggunakan format yang sama, dan secara otomatis menyajikan format yang berbeda tergantung pada budaya.

Dalam contoh di atas, setiap kali saya memanggil FORMAT() , Saya memberikan nilai dan format string yang sama. Satu-satunya perbedaan adalah nilai argumen budaya. Hal ini menyebabkan hasil yang berbeda, tergantung dari budaya yang digunakan. Simbol mata uang dan posisinya ditentukan oleh budaya. Karakter yang digunakan untuk pemisah desimal dan pemisah grup juga ditentukan oleh budaya.

Contoh 2 – Nilai Negatif

Pemformatan juga dapat bergantung pada apakah nilainya positif atau negatif. Jika kita menggunakan nilai negatif, inilah yang terjadi:

DECLARE @num decimal(3,2) =-1.23;SELECT FORMAT(@num, 'C', 'en-us') 'en-us', FORMAT(@num, 'C', 'en- gb') 'en-gb', FORMAT(@num, 'C', 'th-th') 'th-th', FORMAT(@num, 'C', 'nl-nl') 'nl-nl' , FORMAT(@num, 'C', 'ne-np') 'ne-np', FORMAT(@num, 'C', 'fa-ir') 'fa-ir';

Hasil:

+---------+---------+---------+---------+------ ---+-----------+| id-kita | id-gb | ke-th | nl-nl | ne-np | fa-ir ||---------+---------+---------+--------+----- ----+-----------|| ($1.23) | -£1,23 | -฿1.23 | € -1,23 | -रु 1,23 | 1/23-ريال |+---------+---------+---------+---------+--- ------+-----------+

Dalam beberapa budaya, tanda minus muncul sebelum tanda mata uang, di budaya lain muncul setelahnya. Namun di budaya lain, tidak ada tanda minus sama sekali – diganti dengan tanda kurung yang mengelilingi seluruh hasil, termasuk tanda mata uang.

Namun, kita tidak boleh berasumsi bahwa aturan yang sama diterapkan di semua string format. Misalnya, jika kami memformatnya sebagai angka, bukan mata uang, kami tidak akan mendapatkan tanda kurung:

DECLARE @num decimal(3,2) =-1.23;SELECT FORMAT(@num, 'N', 'en-us') 'en-us', FORMAT(@num, 'N', 'en- gb') 'en-gb', FORMAT(@num, 'N', 'th-th') 'th-th', FORMAT(@num, 'N', 'nl-nl') 'nl-nl' , FORMAT(@num, 'N', 'ne-np') 'ne-np', FORMAT(@num, 'N', 'fa-ir') 'fa-ir';

Hasil:

+---------+---------+---------+---------+------ ---+---------+| id-kita | id-gb | ke-th | nl-nl | ne-np | fa-ir ||---------+---------+---------+--------+----- ----+---------|| -1.23 | -1.23 | -1.23 | -1,23 | -1.23 | 1/23- |+---------+---------+---------+---------+----- -----+--------+

Contoh 3 – Tanggal dan Waktu

Pemformatan angka bukan satu-satunya hal yang dipengaruhi oleh budaya. Tanggal dan waktu misalnya, juga akan diformat secara berbeda tergantung pada budayanya.

DECLARE @date datetime2(0) ='2019-06-15 13:45:30';SELECT FORMAT(@date, 'G', 'en-us') 'en-us', FORMAT(@date , 'G', 'en-gb') 'en-gb', FORMAT(@tanggal, 'G', 'th-th') 'th-th', FORMAT(@date, 'G', 'nl- nl') 'nl-nl', FORMAT(@tanggal, 'G', 'ne-np') 'ne-np', FORMAT(@tanggal, 'G', 'fa-ir') 'fa-ir';

Hasil (menggunakan keluaran vertikal):

di-kita | 15/6/2019 1:45:30 PM-gb | 15/06/2019 13:45:30 | 15/6/2562 13:45:30nl-nl | 15-6-2019 13:45:30-np | 15/6/2019 1:45:30 fa-ir | 25/03/1398 01:45:30 .ظ

Contoh ini menggunakan format tanggal/waktu yang umum (dicapai dengan menggunakan G – salah satu penentu format tanggal dan waktu standar), dan perbedaan antar budaya terlihat jelas.

Tapi kita juga bisa melihat perbedaan bahkan saat menggunakan format tanggal yang panjang:

DECLARE @date datetime2(0) ='2019-06-15 13:45:30';SELECT FORMAT(@date, 'F', 'en-us') 'en-us', FORMAT(@date , 'F', 'en-gb') 'en-gb', FORMAT(@tanggal, 'F', 'th-th') 'th-th', FORMAT(@date, 'F', 'nl- nl') 'nl-nl', FORMAT(@tanggal, 'F', 'ne-np') 'ne-np', FORMAT(@tanggal, 'F', 'fa-ir') 'fa-ir';

Hasil (menggunakan keluaran vertikal):

di-kita | Sabtu, 15 Juni 2019 1:45:30 PM-gb | 15 Juni 2019 13:45:30 | 15 2562 13:45:30nl-nl | zaterdag 15 juni 2019 13:45:30-np | Senin, 15 Mei 2019 1:45:30 fa-ir | , 25 اد 1398 01:45:30 .ظ

Contoh 4 – Bagaimana dengan String Format Kustom?

Contoh sebelumnya menggunakan string format standar, yang cukup banyak melakukan pemformatan untuk Anda. Ini seperti cara singkat untuk menentukan string format khusus. Penentu format khusus di sisi lain, memungkinkan Anda untuk menentukan dengan tepat karakter apa yang muncul di output, dan ke mana mereka pergi. Namun, ini biasanya berarti Anda perlu menggunakan lebih banyak penentu format dalam string format Anda.

Tetapi bahkan ketika Anda menggunakan penentu format khusus, output yang tepat juga dapat bergantung pada lokal. Jika kami ingin menggunakan string format tanggal dan waktu khusus untuk meniru contoh sebelumnya, kami dapat melakukan sesuatu seperti ini:

DECLARE @date datetime2(0) ='2019-06-15 13:45:30';SELECT FORMAT(@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', FORMAT(@tanggal, 'dddd, dd MMMM yyyy hh:mm:ss tt', 'nl-nl') 'nl-nl', FORMAT (@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';

Hasil (menggunakan keluaran vertikal):

en-us | Sabtu, 15 Juni 2019 01:45:30 PM-gb | Sabtu, 15 Juni 2019 13:45:30-th | , 15 2562 01:45:30 PMnl-nl | zaterdag, 15 juni 2019 01:45:30 ne-np | Rabu, 15 Juli 2019 01:45:30 fa-ir | , 25 اد 1398 01:45:30 .ظ

Mungkin pengamatan yang paling jelas adalah bahwa hasilnya diformat menggunakan bahasa lokal yang ditentukan. Tetapi jika kita perhatikan lebih dekat, kita dapat melihat bahwa itu juga mengabaikan penanda AM/PM (tt ) untuk nl-nl budaya, mungkin karena budaya itu biasanya menggunakan jam 24 jam. Kami juga dapat melihat bahwa bahkan penentuan posisi kami dapat diabaikan dalam beberapa kasus (mis. fa-ir ).

Namun, tidak semuanya diabaikan sehingga kami berakhir dengan kombinasi spesifikasi eksplisit kami dan yang ditentukan oleh lokal.

Menemukan/Mengubah Bahasa Anda Saat Ini

Seperti yang disebutkan, jika Anda tidak memberikan argumen "budaya", bahasa sesi Anda saat ini akan digunakan untuk menentukan lokal.

Ada beberapa cara untuk menemukan bahasa sesi Anda saat ini.

Anda juga dapat mengubah lokal koneksi Anda saat ini.

Atau, Anda bisa menggunakan SET LANGUAGE pernyataan untuk mengganti bahasa saat ini sesuai kebutuhan.

Berikut adalah contoh singkat menggunakan SET LANGUAGE untuk menunjukkan bahwa setelan bahasa Anda sendiri dapat memengaruhi hasil pemformatan sama seperti saat Anda menggunakan argumen “budaya”, seperti pada contoh sebelumnya.

DECLARE @num decimal(3,2) =-1.23;SET LANGUAGE British;SELECT FORMAT(@num, 'C') Result;SET LANGUAGE US_English;SELECT FORMAT(@num, 'C') Result; 

Hasil:

+----------+| Hasil ||----------|| -£1,23 |+----------++----------+| Hasil ||----------|| ($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. Cara Menggunakan Wizard Impor/Ekspor Di SQL Server - Tutorial SQL Server / TSQL Bagian 104

  2. Mengkonversi dari DateTime ke INT

  3. Kunci asing ke kunci komposit

  4. Bagaimana SESSION_CONTEXT() Bekerja di SQL Server

  5. Pemecahan Masalah Kesalahan Microsoft SQL Server 18456