Dukungan Jenis Data untuk Peningkatan Tanggal dan Waktu ODBC

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

Topik ini menyediakan informasi tentang jenis ODBC yang mendukung jenis data tanggal dan waktu SQL Server.

Pemetaan Jenis Data dalam Parameter dan Hasil

Selain jenis data ODBC (SQL_TYPE_TIMESTAMP dan SQL_TIMESTAMP), dua jenis data baru ditambahkan di SQL Server Native Client ODBC untuk mengekspos jenis server baru:

  • SQL_SS_TIME2

  • SQL_SS_TIMESTAMPOFFSET

Tabel berikut ini memperlihatkan pemetaan tipe server lengkap. Perhatikan bahwa beberapa sel tabel berisi dua entri; dalam kasus ini, yang pertama adalah nilai ODBC 3.0 dan yang kedua adalah nilai ODBC 2.0.

Tipe data SQL Server Tipe data SQL Nilai
Tanggalwaktu SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
93 (sql.h)

11 (sqlext.h)
Waktu smalldatetime SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
93 (sql.h)

11 (sqlext.h)
Tanggal SQL_TYPE_DATE

SQL_DATE
91 (sql.h)

9 (sqlext.h)
Waktu SQL_SS_TIME2 -154 (SQLNCLI.h)
DatetimeOFFSET SQL_SS_TIMESTAMPOFFSET -155 (SQLNCLI.h)
Tanggalwaktu2 SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
93 (sql.h)

11 (sqlext.h)

Tabel berikut mencantumkan struktur terkait dan tipe ODBC C. Karena ODBC tidak mengizinkan driver yang ditentukan jenis C, SQL_C_BINARY digunakan untuk waktu dan datetimeoffset sebagai struktur biner.

Tipe data SQL Tata letak memori Tipe data C default Nilai (sqlext.h)
SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
SQL_TIMESTAMP_STRUCT

TIMESTAMP_STRUCT
SQL_C_TYPE_TIMESTAMP

SQL_C_TIMESTAMP
SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
SQL_TYPE_DATE

SQL_DATE
SQL_DATE_STRUCT

DATE_STRUCT
SQL_C_TYPE_DATE

SQL_C_DATE
SQL_TYPE_DATE

SQL_DATE
SQL_SS_TIME2 SQL_SS_TIME2_STRUCT SQL_C_SS_TIME2

SQL_C_BINARY (ODBC 3.5 dan yang lebih lama)
0x4000 (sqlncli.h)

SQL_BINARY (-2)
SQL_SS_TIMESTAMPOFFSET SQL_SS_TIMESTAMPOFFSET_STRUCT SQL_C_SS_TIMESTAMPOFFSET

SQL_C_BINARY (ODBC 3.5 dan yang lebih lama)
0x4001 (sqlncli.h)

SQL_BINARY (-2)

Ketika SQL_C_BINARY pengikatan ditentukan, pemeriksaan perataan akan dilakukan dan kesalahan yang dilaporkan untuk perataan yang salah. SQLSTATE untuk kesalahan ini adalah IM016, dengan pesan "Perataan struktur yang salah".

Format Data: String dan Literal

Tabel berikut ini memperlihatkan pemetaan antara jenis data SQL Server, jenis data ODBC, dan literal string ODBC.

Tipe data SQL Server Tipe data ODBC Format string untuk konversi klien
Tanggalwaktu SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
'yyyy-mm-dd hh:mm:ss[.999]'

SQL Server mendukung hingga tiga digit kedua pecahan untuk Datetime.
Waktu smalldatetime SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
'yyyy-mm-dd hh:hh:ss'

Jenis data ini memiliki akurasi satu menit. Komponen detik akan menjadi nol pada output dan akan dibulatkan oleh server pada input.
Tanggal SQL_TYPE_DATE

SQL_DATE
'yyyy-mm-dd'
Waktu SQL_SS_TIME2 'hh:mm:ss[.9999999]'

Detik pecahan dapat ditentukan secara opsional menggunakan hingga tujuh digit.
Tanggalwaktu2 SQL_TYPE_TIMESTAMP

SQL_TIMESTAMP
'yyyy-mm-dd hh:mm:ss[.9999999]'

Detik pecahan dapat ditentukan secara opsional menggunakan hingga tujuh digit.
DatetimeOFFSET SQL_SS_TIMESTAMPOFFSET 'yyyy-mm-dd hh:mm:ss[.9999999] +/- hh:mm'

Detik pecahan dapat ditentukan secara opsional menggunakan hingga tujuh digit.

Tidak ada perubahan pada urutan escape ODBC untuk literal tanggal/waktu.

Detik pecahan dalam hasil selalu menggunakan titik (.), bukan titik dua (:).

Nilai string yang dikembalikan ke aplikasi selalu memiliki panjang yang sama untuk kolom tertentu. Komponen tahun, bulan, hari, jam, menit, dan kedua diisi dengan nol di depan ke lebar maksimumnya, dan ada satu spasi antara tanggal dan waktu dalam nilai tanggalwaktu. Ada juga satu spasi antara waktu dan offset zona waktu dalam nilai datetimeoffset. Offset zona waktu selalu didahului oleh tanda; ketika offset adalah nol, tanda ini adalah plus (+). Detik pecahan diisi dengan nol berikutnya jika perlu, hingga presisi yang ditentukan untuk kolom. Untuk kolom tanggalwaktu, ada tiga digit detik pecahan. Untuk kolom smalldatetime, tidak ada digit detik pecahan, dan detik akan selalu nol.

String kosong bukan harfiah tanggal/waktu yang valid dan tidak mewakili nilai NULL. Upaya untuk mengonversi string kosong menjadi nilai tanggal/waktu akan mengakibatkan kesalahan SQLState 22018 dan pesan "Nilai karakter tidak valid untuk spesifikasi cast".

Konversi dari parameter string akan mengharapkan string dalam format yang sama, dengan pengecualian bahwa tanda zona waktu dengan nol jam dan nol menit dapat berupa plus atau minus, dan nol berikutnya diizinkan untuk detik pecahan hingga maksimum 9 digit. Komponen waktu dapat berakhir dengan titik desimal dan tidak ada digit detik pecahan.

Saat ini, driver memungkinkan ruang kosong tambahan di sekitar karakter tanda baca dan ruang antara offset waktu dan zona waktu bersifat opsional. Namun, ini mungkin berubah dalam rilis mendatang; aplikasi tidak boleh mengandalkan perilaku saat ini.

Format Data: Struktur Data

Dalam struktur yang dijelaskan di bawah ini, ODBC menentukan batasan berikut, yang diambil dari kalender Gregorian:

  • Rentang bulan adalah 1 hingga 12.

  • Rentang bidang hari adalah 1 hingga jumlah hari dalam sebulan, dan harus konsisten dengan bidang tahun dan bulan, dengan mempertimbangkan tahun kampung.

  • Rentang jam adalah 0 hingga 23.

  • Rentang menit adalah 0 hingga 59.

  • Rentang detik adalah 0 hingga 61,9(n). Ini memungkinkan hingga dua detik lompatan untuk mempertahankan sinkronisasi dengan waktu sampingan.

    Perhatikan bahwa SQL Server tidak mengizinkan detik lompatan, sehingga nilai kedua yang lebih besar dari 59 akan menyebabkan kesalahan server.

Implementasi untuk struktur ODBC yang ada berikut telah dimodifikasi untuk mendukung jenis data tanggal dan waktu SQL Server baru. Definisinya, bagaimanapun, tidak berubah.

  • DATE_STRUCT

  • TIME_STRUCT

  • TIMESTAMP_STRUCT

Ada juga dua struktur baru:

  • SQL_SS_TIME2_STRUCT

  • SQL_SS_TIMESTAMPOFFSET_STRUCT

SQL_SS_TIME2_STRUCT

Struktur ini diisi hingga 12 byte pada sistem operasi 32-bit dan 64-bit.

typedef struct tagSS_TIME2_STRUCT {  
   SQLUSMALLINT hour;  
   SQLUSMALLINT minute;  
   SQLUSMALLINT second;  
   SQLUINTEGER fraction;  
} SQL_SS_TIME2_STRUCT;  

SQL_SS_TIMESTAMPOFFSET_STRUCT

typedef struct tagSS_TIMESTAMPOFFSET_STRUCT {  
   SQLSMALLINT year;  
   SQLUSMALLINT month;  
   SQLUSMALLINT day;  
   SQLUSMALLINT hour;  
   SQLUSMALLINT minute;  
   SQLUSMALLINT second;  
   SQLUINTEGER fraction;  
   SQLSMALLINT timezone_hour;  
   SQLSMALLINT timezone_minute;  
} SQL_SS_TIMESTAMPOFFSET_STRUCT;  

Jika timezone_hour negatif, timezone_minute harus negatif atau nol. Jika timezone_hour positif, timezone_minute harus positif atau nol. Jika timezone_hour nol, timezone_minute mungkin memiliki nilai apa pun dalam rentang -59 hingga +59.

Lihat Juga

Peningkatan Tanggal dan Waktu (ODBC)