Pada artikel ini, kita akan mengeksplorasi menggunakan format tanggal SQL CONVERT yang berbeda dalam SQL Server.
Interpretasi tanggal bervariasi antara negara yang berbeda. Misalkan Anda memiliki database SQL Server global dengan tabel yang menyimpan format tanggal tertentu. Misalnya, ia memiliki kolom tanggal yang memiliki nilai 01/05/2020.
Bagaimana Anda menafsirkannya? Mari kita lihat interpretasi berikut di berbagai negara.
- AS:5 Jan 2020 (Format standar – bb/hh/tttt)
- Eropa:1 Mei 2020 (Format standar – hh/bb/tttt)
Selain itu, negara lain mengikuti format tanggal yang berbeda:
- Turki:dd.mm.yyyy
- India:dd-mm-yyyy
- Bulgaria:yyyy-m-d
- Hongaria:yyyy.mm.dd.
Anda dapat merujuk ke Wikipedia untuk informasi selengkapnya tentang format tanggal menurut negara.
Selain itu, terkadang kami juga ingin menyertakan stempel waktu beserta tanggalnya. Beberapa contohnya adalah:
- 05/01/2020 10:00 pagi
- 0/05/2020 14:00
- 0/05/2020 14:00
- 05/01/2020 02:00:55
Tidak mungkin menyimpan tanggal dalam tabel SQL Server dalam format yang berbeda, jadi kami memerlukan cara untuk mengonversi format tanggal. Mari kita jelajahi berbagai metode format tanggal SQL CONVERT.
fungsi tanggal SQL CONVERT
Biasanya, profesional database menggunakan fungsi tanggal SQL CONVERT untuk mendapatkan tanggal ke dalam format yang ditentukan dan konsisten. Ini menerapkan kode gaya untuk tanggal keluaran tertentu.
Sintaks fungsi CONVERT():
CONVERT(tipe data, datetime [,style])
Dalam kueri SQL di bawah ini, kami mengonversi datetime menjadi dua format menggunakan fungsi CONVERT().
- format bb/hh/ttt:kode gaya 1
- format bb/hh/tttt:kode gaya 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]
Demikian pula, kami dapat menentukan kode gaya yang berbeda sehingga Anda dapat mengonversi tanggal ke dalam format yang Anda inginkan.
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]
Pada tangkapan layar di bawah, Anda dapat melihat kode gaya, standar, format, dan tanggal keluarannya.
Mengonversi tanggal menggunakan fungsi FORMAT()
Dalam fungsi CONVERT() di atas, kita diminta untuk menentukan kode gaya untuk output format tertentu. Biasanya, kita tidak ingin harus mengingat kode-kode ini; oleh karena itu, Microsoft memperkenalkan fungsi FORMAT() di SQL Server 2012.
Sintaksnya ditunjukkan di bawah ini.
FORMAT (nilai, format [, budaya])
Nilai :Ini membutuhkan nilai dalam format yang didukung. Anda dapat merujuk ke dokumentasi Microsoft untuk daftar mendetail.
Format :Dalam format, kita dapat menentukan kode format atau pola untuk menyembunyikan data tanggal input. Script di bawah ini menunjukkan kode format, pola dan format output.
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'
Budaya :Ini adalah argumen opsional dan mendefinisikan budaya. Jika kami tidak menentukan budaya apa pun, SQL Server menggunakan bahasa sesi saat ini.
Dalam kueri di bawah ini, kami akan mengonversi format tanggal menjadi budaya tertentu. Kita perlu menentukan kode budaya. Misalnya, kode budaya untuk AS adalah en-US dan hi-IN untuk India.
Skrip menggunakan d kode format untuk pola tanggal pendek.
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)';
Anda mendapatkan format tanggal dalam budaya tertentu, seperti yang ditunjukkan di bawah ini.
Jika Anda ingin keluaran tanggal dalam pola tanggal/waktu (lama) penuh, tentukan kode format F, dan dengan cepat akan mengubah format tanggal Anda.
Dalam format tanggal, Anda juga dapat menentukan format khusus dan mengonversi string tanggal input sesuai kebutuhan Anda.
Untuk menentukan string khusus, kita dapat menggunakan singkatan berikut.
- dd:Hari dalam sebulan (01 hingga 31)
- dddd:ejaan hari
- MM:Nomor bulan (01 hingga 12)
- MMMM:Ejaan bulan
- yy:Tahun dalam dua digit
- yyyy:Tahun empat digit
- hh:Ini jam 01 sampai 12
- HH:Waktunya 24 jam. format jam 00 hingga 23
- mm:menit 00 hingga 59
- ss:detik dari 00 hingga 59
- tt:AM atau PM
Dalam skrip di bawah ini, kami mengonversi format tanggal input menjadi beberapa format menggunakan singkatan atau kode di atas.
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]
Menggunakan AT TIME ZONE di SQL Server 2016 atau yang lebih baru
Negara yang berbeda mengikuti zona waktu yang berbeda. Biasanya, zona waktu ini mengikuti offset dari waktu Coordinated Universal Time (UTC). Beberapa contoh zona waktu adalah:
- Waktu Musim Panas Australia Tengah:UTC +10:30
- Waktu Standar India:UTC +5:30
- Waktu Musim Panas Gunung:UTC-6
- Waktu Singapura:UTC+8
- Waktu Musim Panas Tengah:UTC-5
Anda dapat merujuk ke artikel ini untuk daftar mendetail tentang zona waktu.
Banyak negara mengikuti waktu musim panas dan jam disesuaikan 1 jam (atau 30-45 menit) tergantung pada zona waktu. Misalnya, Waktu Musim Panas Tengah mengikuti jadwal di bawah ini:
- Waktu Standar dimulai:1 November 2020 02:00 waktu setempat. Jam diundur satu jam.
- Waktu Standar berakhir pada 14 Maret 2021 pukul 02:00 waktu setempat. Jam akan maju satu jam.
SQL Server tidak mengetahui zona waktu dan waktu musim panas ini. Biasanya, organisasi mengikuti zona UTC karena tidak memerlukan perubahan apa pun.
Bagaimana kita bisa mengonversi zona waktu di SQL Server?
Anda dapat menggunakan AT TIME ZONE mulai dari SQL Server 2016 dan mengonversi zona waktu. Dalam kueri di bawah, ini menunjukkan tanggal untuk Waktu Standar Pusat, Waktu Standar India, dan Waktu Standar 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'
Untuk mengetahui zona waktu yang didukung, Anda dapat melakukan kueri sys.time_zone_info dan mengembalikan zona waktu dan offset.
Anda kemudian dapat memfilter zona waktu yang saat ini mematuhi waktu musim panas.
Select * from sys.time_zone_info where is_currently_dst=1
Sekarang, mari kita pertimbangkan waktu musim panas untuk Waktu Bagian Timur.
- Waktu Musim Panas dimulai – Minggu, 8 Maret 2020 pukul 02.00.
- Waktu Musim Panas berakhir- Minggu, 1 November 2020, pukul 02.00.
Ubah zona UTC Anda menjadi Waktu Standar Timur, dan Anda dapat melihat dampak dari waktu musim panas.
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];
Poin berguna untuk menggunakan format tanggal SQL CONVERT
Evaluasi persyaratan aplikasi Anda dan pilih tanggal tipe data yang sesuai, SmallDateTime, DateTime, DateTime2, dan DateTimeOffset.
Anda dapat mengonversi format tanggal menggunakan fungsi SQL CONVERT date dan FORMAT; namun, disarankan untuk menggunakan format yang paling sesuai dengan beban kerja Anda. Ini akan membantu Anda menghindari keharusan menggunakan konversi tanggal eksplisit.
Anda dapat menghitung waktu musim panas di SQL Server menggunakan fungsi AT TIME ZONE mulai dari SQL