Konversi Tipe Data tanggalwaktu dari SQL ke C

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Tabel berikut ini mencantumkan masalah yang perlu dipertimbangkan saat Anda mengonversi dari jenis tanggal/waktu SQL Server ke tipe C.

Konversi

SQL_C_DATE SQL_C_TIME SQL_C_TIMESTAMP SQL_C_SS_TIME2 SQL_C_SS_TIMESTAMPOFFSET SQL_C_BINARY SQL_C_CHAR SQL_C_WCHAR
SQL_CHAR 2,3,4,5 2,3,6,7,8 2,3,9,10,11 2,3,6,7 2,3,9,10,11 1 1 1
SQL_WCHAR 2,3,4,5 2,3,6,7,8 2,3,9,10,11 2,3,6,7 2,3,9,10,11 1 1 1
SQL_TYPE_DATE OK 12 13 12 13,23 14 16 16
SQL_SS_TIME2 12 8 15 OK 10,23 17 16 16
SQL_TYPE_TIMESTAMP 18 7,8 OK 7 23 19 16 16
SQL_SS_TIMESTAMPOFFSET 18,22 7,8,20 20 7,20 OK 21 16 16

Kunci ke Simbol

Simbol Arti
OK Tidak ada masalah konversi.
1 Aturan sebelum SQL Server 2008 (10.0.x) berlaku.
2 Spasi awal dan akhir diabaikan.
3 String diuraikan ke dalam tanggal, waktu, zona waktu, atau timezoneoffset, dan memungkinkan hingga 9 digit untuk detik pecahan. Jika timezoneoffset diurai, waktu dikonversi ke zona waktu klien. Jika terjadi kesalahan selama konversi ini, rekaman diagnostik dihasilkan dengan SQLSTATE 22018 dan pesan "Meluapkan bidang Datetime".
4 Jika nilainya bukan nilai tanggal, tanda waktu, atau timestampoffset yang valid, rekaman diagnostik dihasilkan dengan SQLSTATE 22018 dan pesan "Nilai karakter tidak valid untuk spesifikasi cast".
5 Jika waktunya bukan nol, rekaman diagnostik dihasilkan dengan SQLSTATE 01S07 dan pesan "Pemotongan pecahan".
6 Jika nilainya bukan nilai waktu, tanda waktu, atau timestampoffset yang valid, rekaman diagnostik dihasilkan dengan SQLSTATE 22018 dan pesan "Nilai karakter tidak valid untuk spesifikasi cast".
7 Komponen tanggal diabaikan.
8 Jika detik pecahan bukan nol, rekaman diagnostik dihasilkan dengan SQLSTATE 01S07 dan pesan "Pemotongan pecahan".
9 Jika nilainya bukan nilai tanggal, waktu, tanda waktu, atau timestampoffset yang valid, rekaman diagnostik dihasilkan dengan SQLSTATE 22018 dan pesan "Nilai karakter tidak valid untuk spesifikasi cast".
10 Jika nilai adalah waktu yang valid, komponen tanggal diatur ke tanggal klien saat ini.
11 Jika nilainya adalah tanggal yang valid, waktu diatur ke nol.
12 Rekaman diagnostik dihasilkan dengan SQLSTATE 07006 dan pesan "Pelanggaran atribut jenis data terbatas".
13 Waktu diatur ke nol.
14 Jika buffer tidak cukup besar untuk mengakomodasi SQL_DATE_STRUCT, catatan diagnostik dihasilkan dengan SQLSTATE 22003 dan pesan "Nilai numerik di luar rentang".
15 Tanggal diatur ke tanggal klien saat ini.
16 Jika buffer tidak cukup besar untuk mengakomodasi nilai string yang dikonversi tetapi hanya detik pecahan, pemotongan terjadi dan rekaman diagnostik dihasilkan dengan SQLSTATE 01004 dan pesan "Data string, terpotong kanan". Jika buffer tidak cukup besar untuk mengakomodasi nilai string tanpa pemotongan komponen tanggal, waktu, atau offset, rekaman diagnostik dihasilkan dengan SQLSTATE 22003 dan pesan "Nilai numerik di luar rentang". Perhatikan bahwa untuk tanggal dan timestampoffset, SQLSTATE 01004 tidak dimungkinkan karena bagian paling kanan dari string yang dikonversi tidak berisi detik pecahan. Oleh karena itu, setiap pemotongan menyebabkan kehilangan data.
17 Jika buffer tidak cukup besar untuk mengakomodasi SQL_SS_TIME2_STRUCT, rekaman diagnostik dihasilkan dengan SQLSTATE 22003 dan pesan "Nilai numerik di luar rentang".
18 Jika waktunya bukan nol, rekaman diagnostik dihasilkan dengan SQLSTATE 01S07 dan pesan "Pemotongan pecahan".
19 Jika jenis server adalah datetime atau smalldatetime, nilai sesuai dengan format kawat TDS dan akan menjadi nilai 4-byte untuk smalldatetime dan nilai 8-byte untuk datetime.

Jika jenis server adalah datetime2, nilai dikembalikan sebagai SQL_TIMESTAMP_STRUCT. Jika buffer tidak cukup besar untuk mengakomodasi nilai yang dikembalikan, rekaman diagnostik dihasilkan dengan SQLSTATE 22003 dan pesan "Nilai numerik di luar rentang".
20 Waktu dikonversi ke zona waktu klien. Jika terjadi kesalahan selama konversi ini, rekaman diagnostik dihasilkan dengan SQLSTATE 22008 dan pesan "Meluap bidang Datetime".
21 Jika buffer cukup besar untuk mengakomodasi SQL_SS_TIMESTAMPOFFSET_STRUCT, nilai dikembalikan sebagai SQL_SS_TIMESTAMPOFFSET_STRUCT. Jika tidak, rekaman diagnostik dihasilkan dengan SQLSTATE 22003 dan pesan "Nilai numerik di luar rentang".
22 Nilai dikonversi ke zona waktu klien sebelum tanggal diekstrak. Ini memberikan konsistensi dengan konversi lain dengan jenis timestampoffset. Jika terjadi kesalahan selama konversi ini, rekaman diagnostik dihasilkan dengan SQLSTATE 22008 dan pesan "Meluap bidang Datetime". Ini dapat mengakibatkan tanggal yang berbeda dari nilai yang diperoleh dengan pemotongan sederhana.

Tabel dalam topik ini menjelaskan konversi antara jenis yang dikembalikan ke klien dan jenis dalam pengikatan. Untuk parameter output, jika jenis server yang ditentukan di SQLBindParameter tidak cocok dengan jenis aktual di server, konversi implisit akan dilakukan oleh server dan jenis yang dikembalikan ke klien akan cocok dengan jenis yang ditentukan melalui SQLBindParameter. Ini dapat menyebabkan hasil konversi yang tidak terduga ketika aturan konversi server berbeda dari yang tercantum dalam tabel sebelumnya. Misalnya, ketika tanggal default harus disediakan, SQL Server menggunakan 1900-1-1, bukan tanggal saat ini.

Lihat Juga

Peningkatan Tanggal dan Waktu (ODBC)