Mungkin Anda pernah menjumpai T-SQL PARSE()
, CAST()
, dan CONVERT()
berfungsi ketika bekerja dengan SQL Server dan bertanya-tanya apa bedanya. Ketiga fungsi tersebut tampaknya melakukan hal yang sama, tetapi ada perbedaan tipis di antara mereka.
Dalam artikel ini saya bertujuan untuk menguraikan perbedaan utama antara fungsi-fungsi ini.
Perbandingan
Berikut tabel yang menguraikan perbedaan utama antara CONVERT()
, CAST()
, dan PARSE()
fungsi di SQL Server:
KONVERSI() | CAST() | PARSE() | |
---|---|---|---|
Definisi Resmi | Mengonversi ekspresi dari satu tipe data ke tipe data lainnya. | Mengonversi ekspresi dari satu tipe data ke tipe data lainnya. | Mengembalikan hasil ekspresi, diterjemahkan ke tipe data yang diminta di SQL Server. |
Nilai yang Diterima | Ekspresi apa pun yang valid. | Ekspresi apa pun yang valid. | Tali. |
Nilai Pengembalian | Argumen ke-2, diterjemahkan ke tipe data yang diminta seperti yang disediakan oleh argumen ke-1. | Argumen ke-1, diterjemahkan ke tipe data yang diminta seperti yang disediakan oleh argumen ke-2. | Argumen ke-1, diterjemahkan ke tipe data yang diminta seperti yang disediakan oleh argumen ke-2. |
Konversi yang Didukung | Antara dua tipe data. | Antara dua tipe data. | Dari string ke tanggal/waktu dan tipe angka saja. |
Menerima gaya Argumen? | Ya. | Tidak. | Tidak. |
Menerima budaya Argumen? | Tidak. | Tidak. | Ya. |
Memerlukan .NET Framework? | Tidak. | Tidak. | Ya. |
Beberapa poin lain selain tabel di atas:
- Dokumentasi Microsoft menunjukkan bahwa
PARSE()
tidak akan diremote (karena itu tergantung pada keberadaan CLR). Memindahkan fungsi yang memerlukan CLR akan menyebabkan kesalahan pada server jarak jauh. - Ada beberapa nilai yang
PARSE()
dapat menangani tetapiCAST()
danCONVERT()
tidak bisa (misalnya, string menggunakan format tanggal tertentu). CAST()
termasuk dalam standar ANSI SQL-92.- Beberapa berpendapat bahwa
CAST()
memiliki kinerja yang lebih baik daripada dua lainnya. - Ada overhead kinerja tertentu saat mengurai nilai string. Oleh karena itu,
PARSE()
biasanya akan berjalan lebih lambat dari dua lainnya.
Di bawah ini adalah contoh situasi di mana setiap fungsi akan menjadi yang paling sesuai.
Kapan menggunakan CAST()
Argumen yang baik dapat dibuat untuk menggunakan CAST()
untuk skenario apa pun yang tidak tercantum di bawah ini. Seperti yang disebutkan, CAST()
telah menjadi bagian dari standar SQL ANSI sejak SQL-92, sehingga harus lebih portabel di antara DBMS yang berbeda (jika diperlukan).
Juga, beberapa berpendapat bahwa CAST()
memiliki kinerja yang lebih baik daripada dua fungsi lainnya (inilah artikel menarik yang membandingkan kinerja antara ketiga fungsi tersebut).
Namun, ada juga alasan valid yang mungkin Anda sukai (atau butuhkan) untuk menggunakan CONVERT()
melalui CAST()
.
Kapan menggunakan CONVERT()
CONVERT()
fungsi dapat berguna ketika Anda perlu menggunakan style
argumen untuk menentukan bagaimana tanggal harus diformat saat mengonversi antara tanggal dan string. Berikut beberapa contohnya:
DECLARE @date datetime2 = '2018-06-07 02:35:52.8537677'; SELECT CONVERT(nvarchar(30), @date, 100) AS '100', CONVERT(nvarchar(30), @date, 101) AS '101', CONVERT(nvarchar(30), @date, 102) AS '102', CONVERT(nvarchar(30), @date, 103) AS '103';
Hasil:
+---------------------+------------+------------+------------+ | 100 | 101 | 102 | 103 | |---------------------+------------+------------+------------| | Jun 7 2018 2:35AM | 06/07/2018 | 2018.06.07 | 07/06/2018 | +---------------------+------------+------------+------------+
Anda hanya dapat melakukan ini dengan CONVERT()
karena:
CAST()
tidak mendukungstyle
argumen; danPARSE()
tidak mengonversi dari tanggal/waktu ke nilai string (itu juga tidak mendukungstyle
argumen)
Kapan menggunakan PARSE()
Terlepas dari berbagai kelemahan fungsi ini (kinerja, ketergantungan pada .NET, konversi tipe data terbatas), ia juga memiliki beberapa keuntungan, dan ada beberapa skenario di mana itu bisa menjadi satu-satunya pilihan Anda. Misalnya, saat memberikan tanggal yang menyertakan nama hari kerja, seperti Jumat, 20 Juli 2018 .
Saat Yang Lain Mengembalikan Kesalahan
Berikut adalah contoh di mana PARSE()
adalah satu-satunya fungsi dari ketiganya yang berhasil mengonversi nilai tanpa menimbulkan kesalahan.
Dalam contoh ini, kami mencoba mengonversi berbagai nilai string menjadi tanggal tipe data. Namun, nilai string yang kami berikan menyertakan nama hari kerja. Ini menyebabkan masalah untuk CAST()
dan CONVERT()
, tetapi PARSE()
tidak ada masalah.
PARSE()
SELECT PARSE('Friday, 20 July 2018' AS date) AS 'Result 1', PARSE('Fri, 20 July 2018' AS date) AS 'Result 2', PARSE('Friday 20 July 2018' AS date) AS 'Result 3';
Hasil:
+------------+------------+------------+ | Result 1 | Result 2 | Result 3 | |------------+------------+------------| | 2018-07-20 | 2018-07-20 | 2018-07-20 | +------------+------------+------------+
Jadi PARSE()
tidak ada masalah dengan format tanggal yang kami berikan.
KONVERSI()
SELECT CONVERT(date, 'Friday, 20 July 2018') AS 'Result 1', CONVERT(date, 'Fri, 20 July 2018') AS 'Result 2', CONVERT(date, 'Friday 20 July 2018') AS 'Result 3';
Hasil:
Conversion failed when converting date and/or time from character string.
Jadi CONVERT()
tidak dapat mengonversi string saat dalam format seperti itu.
CAST()
SELECT CAST('Friday, 20 July 2018' AS date) AS 'Result 1', CAST('Fri, 20 July 2018' AS date)AS 'Result 2', CAST('Friday 20 July 2018' AS date) AS 'Result 3';
Hasil:
Conversion failed when converting date and/or time from character string.
Dan CAST()
mengembalikan kesalahan yang sama.
Jadi jika Anda mendapati diri Anda mendapatkan kesalahan dengan dua fungsi lainnya, coba PARSE()
sebagai gantinya.
Menentukan Budaya
Skenario lain di mana Anda mungkin lebih suka menggunakan PARSE()
fungsinya adalah saat menentukan budaya/bahasa tempat string disediakan. PARSE()
memiliki argumen opsional yang memungkinkan Anda menentukan budaya mana yang akan digunakan. Jika dihilangkan, bahasa sesi saat ini akan digunakan.
Contoh menyertakan culture
argumen:
SELECT PARSE('07/01/2018' AS date USING 'en-US') AS 'Result 1', PARSE('07/01/2018' AS date USING 'de-DE') AS 'Result 2';
Hasil:
+------------+------------+ | Result 1 | Result 2 | |------------+------------| | 2018-07-01 | 2018-01-07 | +------------+------------+
Alternatif Budaya
Meskipun manfaat dapat menentukan budaya dengan PARSE()
, Anda memiliki kemampuan untuk mengubah pengaturan bahasa, yang berarti Anda dapat mencapai efek yang sama saat menggunakan CAST()
atau CONVERT()
.
Misalnya, menggunakan SET LANGUAGE us_english
sebelum kueri akan mengubah pengaturan bahasa saat ini menjadi us_english . Meskipun ini tidak memungkinkan Anda untuk menentukan budaya yang berbeda dalam kueri (seperti dalam contoh di atas), hal ini memengaruhi seluruh kueri (dan kueri berikutnya).
Anda juga dapat mengubah pengaturan format tanggal dengan cara yang sama. Misalnya, SET DATEFORMAT mdy
.
Berikut adalah contoh mengubah pengaturan bahasa sebelum menjalankan kueri dengan CAST()
dan CONVERT()
:
Jerman:
SET LANGUAGE German; SELECT CONVERT(date, '07/01/2018') AS 'Convert'; SELECT CAST('07/01/2018' AS date) AS 'Cast';
Hasil:
+------------+ | Convert | |------------| | 2018-01-07 | +------------+ Die Spracheneinstellung wurde in Deutsch geändert. +------------+ | Cast | |------------| | 2018-01-07 | +------------+
us_english:
SET LANGUAGE us_english; SELECT CONVERT(date, '07/01/2018') AS 'Convert'; SELECT CAST('07/01/2018' AS date) AS 'Cast';
Hasil:
+------------+ | Convert | |------------| | 2018-07-01 | +------------+ Changed language setting to us_english. +------------+ | Cast | |------------| | 2018-07-01 | +------------+
Ingat, ketika Anda melakukan ini, Anda mengubah lingkungan format bahasa/tanggal untuk sesi tersebut. Jangan lupa untuk mengubahnya kembali!