Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Format Tanggal SQL:Cara Menanganinya dengan Cara Cerdas

Berkat keragaman budaya di Bumi, kami memiliki berbagai format tanggal. Untuk tanggal numerik, kami memiliki bulan-hari-tahun, hari-bulan-tahun, dan tahun-bulan-hari. Kami juga memiliki format pendek dan panjang. Tanggal dapat dicampur dengan waktu, yang merupakan cerita lain. Realitas ini mengikuti kita di tempat kerja. Itu sebabnya format tanggal SQL bukanlah sesuatu yang bisa kita ambil dengan mudah.

Di Filipina, kami menggunakan 2 format:bulan-hari-tahun dan hari-bulan-tahun. Bulan-hari-tahun adalah format umum untuk tanggal numerik. Namun dengan format tanggal yang lebih panjang, kami menggunakan hari-bulan-tahun dan bulan-hari-tahun secara bergantian.

Di tempat kerja, saya tidak pernah menemukan pengaturan format tanggal SQL Server selain bulan-hari-tahun. Namun, ini bervariasi dalam laporan dan file untuk pertukaran data dan proyek Extract-Transform-Load (ETL). Apalagi pengguna yang mengubahnya di stasiun mereka untuk preferensi pribadi! Dengan semua skenario ini, tidak menanganinya dengan tepat adalah resep yang harus dipatahkan.

Apakah aplikasi Anda berhubungan dengan budaya yang berbeda? Itu tingkat kerumitan dan masalah lain ketika berhadapan dengan berbagai format tanggal SQL ini. Dalam artikel ini, kami akan mengeksplorasi standar untuk menangani semua varietas dan contoh ini. Baca terus sampai akhir! Namun sebelum kita melanjutkan, mari kita ambil jalan memutar singkat tentang cara SQL Server menyimpan tanggal.

Bagaimana SQL Server Menyimpan Tanggal

Coba tebak. Apakah SQL Server menyimpan 29/03/2021 21:35 seperti yang ada di database? Bagaimana dengan 2021-03-29? Apakah mereka disimpan sebagai string yang diformat? Berdasarkan dokumentasi dari Microsoft ini, tidak seperti ini.

Mari kita ambil tipe data DATE, misalnya. Itu disimpan sebagai bilangan bulat 3 byte.

Bagaimana kami tahu?

Yah, Microsoft mengatakan demikian tetapi tidak memberikan informasi lebih lanjut. Bukan berarti kita tidak bisa mengetahuinya secara pasti. Pertama, nilai minimum tipe data DATE adalah 01/01/0001 atau 1 Januari 1 CE atau Common Era. Untuk mengonversinya menjadi bilangan bulat, kita ubah tanggal tersebut menjadi VARBINARY terlebih dahulu, seperti ini:

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

Hasilnya adalah 0x000000 dalam format heksadesimal. Dari nilai ini, kita dapat melihat bahwa nilai integer 1 Januari 1 CE adalah 0. Hal ini logis karena itu adalah nilai DATE minimum.

Sekarang, kita maju 1 hari.

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

Hasilnya adalah 0x010000 . Ini sedikit rumit, tetapi posting ini memberi kami ide. Kita tidak bisa memperlakukannya seperti yang kita lihat. Byte dibalik, dan nilai hex sebenarnya adalah 0x000001 . Jika Anda tahu sedikit tentang bilangan heksa, Anda tahu bahwa ini sama dengan 1 – 1 hari dari titik awal, 1 Januari 1 M.

Sekarang, mari kita coba tanggal terbaru:29/03/2021.

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

Hasilnya adalah 0x55420B . Saat kita membalikkannya, menjadi 0x0B4255 . Kali ini, kita tidak bisa mengetahui nilainya dengan melihatnya. Jadi, kita kalikan dengan 1 sebagai bilangan bulat.

SELECT 0x0B4255 * CAST(1 AS INT)

Hasilnya adalah 737.877 . Ini adalah jumlah hari dari 1 Januari 1 CE. Mari kita verifikasi dengan DATEDIFF.

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

Hasilnya sama:737.877 hari. Sangat keren!

Intinya:Tanggal yang Diformat Hanya Untuk Tujuan Presentasi

Begitulah cara SQL Server menyimpan tipe data DATE. Ini berbeda untuk DATETIME, SMALLDATETIME, dan DATETIME2, tetapi masih disimpan sebagai bilangan bulat. SQL Server menghitung durasi waktu dari titik awal dan menampilkan tanggal yang dapat kita pahami.

Baik Anda melihatnya di SQL Server Management Studio, dbForge Studio untuk SQL Server, atau aplikasi Anda, 29/03/2021 hanyalah sebuah presentasi. Jika Anda mengubah wilayah atau bahasa, nilai yang disimpan 0x55420B akan tetap sama.

Sekarang kita tahu bahwa tanggal tidak disimpan sebagai string. Kami dapat melupakan tentang menyimpan tanggal dalam format tertentu . Lagipula bukan itu cara kerjanya. Sebagai gantinya, mari kita lihat berbagai cara dalam SQL untuk memformat tanggal yang dibutuhkan aplikasi Anda.

4 Cara Mudah Memformat Tanggal

Mari kita periksa fungsi tanggal SQL berikut:

  • Fungsi KONVERSI
  • SETEL BAHASA
  • SET FORMAT TANGGAL
  • Fungsi FORMAT

Anda juga dapat menggunakan pemformat kueri SQL.

1. Fungsi KONVERSI

CONVERT adalah salah satu fungsi konversi data yang juga dapat berfungsi untuk pemformatan tanggal. Gambar 1 menampilkan contoh.

Dua argumen pertama CONVERT adalah tipe data target dan nilai tanggal. Yang ketiga adalah opsional tetapi juga berlaku untuk tanggal. Nilai numerik adalah gaya format tanggal SQL yang akan digunakan selama konversi dari tanggal ke string.

Pada Gambar 1, Jepang menggunakan format tahun-bulan-hari dengan garis miring sebagai pemisah. Jerman menggunakan hari-bulan-tahun dengan titik sebagai pemisah. Inggris dan Prancis menggunakan urutan yang sama seperti Jerman, tetapi dengan garis miring sebagai pemisah. Hanya Amerika Serikat yang menggunakan bulan-hari-tahun dengan tanda hubung sebagai pemisah.

Dalam SQL, Anda juga dapat mengonversi ekspresi DATETIME menjadi DATE.

Untuk daftar lengkap gaya format tanggal CONVERT di SQL, periksa referensi ini dari Microsoft.

2. SETEL BAHASA

Pengaturan ini menentukan bahasa yang diterapkan ke sesi. Ini mempengaruhi format tanggal dan pesan sistem. Saat Anda menyetel bahasa, Anda juga secara implisit menerapkan setelan SET DATEFORMAT (kami akan menyelesaikannya nanti).

Untuk saat ini, mari kita periksa contoh di Gambar 2. Saya mengubah pengaturan bahasa ke bahasa Lituania, lalu kembali ke bahasa Inggris.

Lihat Gambar 2. Format tanggal Lituania adalah tahun-bulan-hari. Setiap kali saya mencoba tanggal yang berbeda, tanggal panjang selalu menyertakan 'm.' sebelum bulan dan 'd.' setelah hari. Huruf pertama bulan dan nama hari kerja juga tidak ditulis dengan huruf kapital. Ini berbeda untuk pengaturan bahasa lain tetapi Anda mengerti maksudnya.

Untuk informasi selengkapnya tentang SET LANGUAGE, lihat referensi ini dari Microsoft.

3. SETEL FORMAT TANGGAL

Pengaturan ini menempatkan urutan bulan, hari, dan tahun untuk menafsirkan string karakter tanggal. Ini akan menimpa pengaturan format tanggal implisit yang dilakukan oleh SET LANGUAGE. Berikut ini contohnya pada Gambar 3.

Pada Gambar 3, kode menggunakan format DMY atau hari-bulan-tahun. Di bawah pengaturan ini, nilai tanggal apa pun yang disetel ke variabel tanggal harus mengikuti pola ini. 30/03/2021 cocok dengan format ini, tetapi 31/03/2021 memicu kesalahan karena 31 bukan bulan yang valid.

Dengan demikian, perubahan format tanggal dapat merusak aplikasi Anda jika logika beroperasi pada premis format lain.

Untuk informasi lebih lanjut tentang SET DATEFORMAT, lihat referensi ini dari Microsoft.

4. Fungsi FORMAT

Dari semua opsi pemformatan yang tersedia, ini adalah yang paling fleksibel. Ini serupa untuk pemformatan tanggal di .Net, karena FORMAT bergantung pada keberadaan .Net Framework di server tempat SQL Server diinstal. Namun, itulah kelemahan opsi ini.

Sama seperti melakukannya di C#, FORMAT mengambil nilai tanggal dan string format. Mari kita lihat beberapa contoh pada Gambar 4.

Seperti di .Net, di SQL Server, Anda dapat memformat tanggal menggunakan pemisah yang berbeda. Juga, Anda dapat memposisikan bulan, hari, dan tahun di mana saja. Kemudian, Anda bisa mendapatkan informasi budaya dan menggunakan format tanggalnya.

Untuk informasi dan contoh selengkapnya tentang FORMAT, lihat referensi ini dari Microsoft.

Sekarang, kami telah mengidentifikasi 4 cara untuk memformat tanggal dan berbagai format tanggal. Apakah ada format standar yang selalu berfungsi saat mengonversi string menjadi tanggal?

ISO 8601 – Format Tanggal SQL Paling Portabel, Bebas Kesalahan yang Dapat Anda Gunakan untuk Konversi

ISO 8601 telah ada sejak 1988. Ini adalah standar internasional dalam pertukaran data yang berkaitan dengan tanggal dan waktu .

Ini juga tersedia dalam fungsi CONVERT sebagai salah satu gaya format tanggal:gaya 126 dan 127 sesuai dengan ISO 8601.

Apa yang membuatnya portabel dan bebas kesalahan?

Masalah dengan Format Non-ISO 8601

Mari kita tunjukkan masalah untuk non-ISO 8601 dengan sebuah contoh:

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')

Bergantung pada lokal tanggal Anda, Anda dapat menafsirkan @d sebagai 9 Maret 2021, atau 3 September 2021. Anda tidak dapat memastikan yang mana. Di situlah masalahnya.

Lihat hasilnya pada Gambar 5 di bawah ini:

Bahkan SQL Server tidak mengetahuinya dengan pasti!

Parahnya, skenario semacam ini dapat merusak aplikasi Anda seperti yang terjadi pada Gambar 3 sebelumnya. Situasi ini bermasalah untuk aplikasi yang berurusan dengan pengguna multikultural.

Dapatkah ISO 8601 membantu dalam hal ini?

Menggunakan ISO 8601 untuk Mengatasi Masalah Pemformatan

Perhatikan ketika format ISO 8601 yyyyMMdd digunakan sebagai ganti MM/dd/yyyy dan periksa hasilnya pada Gambar 6:

Itu akan selalu 9 Maret, apa pun bahasa dan pengaturan format tanggal yang digunakan. Ini bagus untuk pertukaran data dan integrasi sistem. Jika pengguna Anda memiliki format tanggal lain di stasiun, itu juga tidak masalah.

Jika Anda perlu mengubah tanggal menjadi string dan sebaliknya, gunakan ISO 8601.

ISO 8601 di SQL Server hadir dalam 2 rasa:

  • YYYYMMDD hanya untuk tanggal.
  • YYYY-MM-DDTHH:MM:SS untuk campuran tanggal dan waktu, di mana T adalah pembatas antara tanggal dan waktu.

Cara Lain untuk Menangani Format Tanggal dari Aplikasi ke SQL Server

1. Gunakan Kontrol Sadar Tanggal di Aplikasi

Saat Anda meminta pengguna untuk memasukkan tanggal dalam formulir, jangan biarkan mereka menggunakan teks bebas. Gunakan kontrol tanggal yang memungkinkan pemilihan hanya dari nilai yang valid.

2. Konversikan ke Format Berbeda Hanya Saat Diperlukan

Jangan terus mengubah tanggal menjadi string dan sebaliknya. Gunakan tipe data Date atau DateTime asli dari aplikasi panggilan. Jika Anda perlu mengubahnya karena alasan apa pun, gunakan ISO 8601.

3. Setel Tanggal/Waktu, Zona Waktu, dan Budaya di Startup Aplikasi Anda, jika Berlaku

Jika aplikasi Anda menggunakan format tanggal tetap, dan pengguna Anda suka mengubah format tanggal, Anda dapat memperbaiki keduanya saat memulai aplikasi. Setel secara eksplisit apa yang dibutuhkan aplikasi Anda. Akan jauh lebih baik jika admin jaringan Anda dapat mengunci pengaturan ini.

Bawa Pulang

Jadi, apakah menangani varietas format tanggal SQL luar biasa? Saya tidak bisa menyalahkan Anda jika Anda masih merasa seperti itu, tetapi kami menemukan bahwa itu bukan tidak mungkin.

Inilah yang telah kami bahas:

  • Tanggal SQL disimpan sebagai bilangan bulat . Apa yang kita lihat dengan mata kita sudah diformat berdasarkan pengaturan SQL Server. Tidak peduli berapa kali kita mengubah bahasa dan format tanggal, nilai yang disimpan akan tetap sama. Tidak ada gunanya memikirkan menyimpan tanggal dalam format tertentu.
  • Ada 4 cara untuk memformat tanggal:CONVERT , SETEL BAHASA , SET FORMAT TANGGAL , dan FORMAT .
  • Jika Anda perlu mengubah tanggal menjadi string dan sebaliknya, gunakan format ISO 8601 .
  • Ada 3 cara lain untuk menangani format tanggal:
    • menggunakan kontrol yang mengetahui tanggal di aplikasi Anda;
    • mengubah tanggal menjadi string hanya jika diperlukan;
    • menyetel zona waktu, budaya, tanggal/waktu server yang diperlukan saat startup jika berlaku .

Apakah menurut Anda ini akan berguna bagi Anda dan orang lain? Kemudian, bagikan artikel ini di platform media sosial favorit Anda.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menyelami NoSQL:Daftar lengkap database NoSQL

  2. Apa itu Gambar Runtime Kustom di Java 9?

  3. SQL Self Gabung

  4. Membuat Database di Situs Cloud

  5. Memahami flush buffer log