Perilaku Jenis Tanggal dan Waktu yang Ditingkatkan dengan Versi SQL Server Sebelumnya (ODBC)

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

Topik ini menjelaskan perilaku yang diharapkan ketika aplikasi klien yang menggunakan fitur tanggal dan waktu yang ditingkatkan berkomunikasi dengan versi SQL Server yang lebih lama dari SQL Server 2008 (10.0.x), dan saat aplikasi klien menggunakan Komponen Akses Data Microsoft, Komponen Akses Data Windows, atau versi SQL Server Native Client yang lebih lama dari SQL Server 2008 (10.0.x) mengirimkan perintah ke server yang mendukung fitur tanggal dan waktu yang ditingkatkan.

Perilaku Klien Tingkat Bawah

Aplikasi klien yang dikompilasi menggunakan versi SQL Server Native Client sebelum SQL Server 2008 (10.0.x) melihat jenis tanggal/waktu baru sebagai kolom nvarchar. Konten kolom adalah representasi harfiah, seperti yang dijelaskan dalam bagian "Format Data: String dan Literal" dari Dukungan Tipe Data untuk Peningkatan Tanggal dan Waktu ODBC. Ukuran kolom adalah panjang harfiah maksimum untuk presisi detik pecahan yang ditentukan untuk kolom.

API Katalog akan mengembalikan metadata yang konsisten dengan kode jenis data tingkat bawah yang dikembalikan ke klien (misalnya, nvarchar) dan representasi tingkat bawah terkait (misalnya, format literal yang sesuai). Namun, nama jenis data yang dikembalikan akan menjadi nama jenis SQL Server 2008 (10.0.x) asli.

Metadata pernyataan yang dikembalikan oleh SQLDescribeCol, SQLDescribeParam, SQGetDescField, dan SQLColAttribute akan mengembalikan metadata yang konsisten dengan jenis tingkat bawah dalam semua hal, termasuk nama jenis. Contoh jenis tingkat bawah seperti itu adalah nvarchar.

Ketika aplikasi klien tingkat bawah berjalan terhadap server SQL Server 2008 (10.0.x) (atau yang lebih baru) di mana skema berubah ke jenis tanggal/waktu telah dibuat, perilaku yang diharapkan adalah sebagai berikut:

Jenis SQL Server 2005 Tipe SQL Server 2008 (10.0.x) (atau yang lebih baru) Jenis klien ODBC Konversi hasil (SQL ke C) Konversi parameter (C ke SQL)
Tanggalwaktu Tanggal SQL_C_TYPE_DATE OK OK (1)
SQL_C_TYPE_TIMESTAMP Bidang waktu diatur ke nol. OK (2)

Gagal jika bidang waktu bukan nol. Bekerja dengan SQL Server 2005 (9.x).
Waktu(0) SQL_C_TYPE_TIME OK OK (1)
SQL_C_TYPE_TIMESTAMP Bidang tanggal diatur ke tanggal saat ini. OK (2)

Tanggal diabaikan. Gagal jika detik pecahan bukan nol. Bekerja dengan SQL Server 2005 (9.x).
Waktu(7) SQL_C_TIME Gagal - waktu harfiah tidak valid. OK (1)
SQL_C_TYPE_TIMESTAMP Gagal - waktu harfiah tidak valid. OK (1)
Datetime2(3) SQL_C_TYPE_TIMESTAMP OK OK (1)
Datetime2(7) SQL_C_TYPE_TIMESTAMP OK Nilai akan dibulatkan ke detik ke-1/300 oleh konversi klien.
Waktu smalldatetime Tanggal SQL_C_TYPE_DATE OK OK
SQL_C_TYPE_TIMESTAMP Bidang waktu diatur ke nol. OK (2)

Gagal jika bidang waktu bukan nol. Bekerja dengan SQL Server 2005 (9.x).
Waktu(0) SQL_C_TYPE_TIME OK OK
SQL_C_TYPE_TIMESTAMP Bidang tanggal diatur ke tanggal saat ini. OK (2)

Tanggal diabaikan. Gagal jika detik pecahan bukan nol.

Bekerja dengan SQL Server 2005 (9.x).
Datetime2(0) SQL_C_TYPE_TIMESTAMP OK OK

Kunci ke Simbol

Simbol Arti
1 Jika bekerja dengan SQL Server 2005 (9.x) itu harus terus bekerja dengan versi SQL Server yang lebih baru.
2 Aplikasi yang bekerja dengan SQL Server 2005 (9.x) dapat gagal dengan versi SQL Server yang lebih baru.

Perhatikan bahwa hanya perubahan skema umum yang telah dipertimbangkan. Berikut ini adalah perubahan umum:

  • Menggunakan jenis baru di mana aplikasi secara logis hanya memerlukan nilai tanggal atau waktu. Namun, aplikasi dipaksa untuk menggunakan tanggalwaktu atau smalldatetime karena kurangnya jenis tanggal dan waktu terpisah.

  • Menggunakan jenis baru untuk mendapatkan presisi atau akurasi detik pecahan tambahan.

  • Beralih ke datetime2 karena ini adalah tipe data tanggal dan waktu yang disukai.

Metadata Kolom dikembalikan oleh SQLColumns, SQLProcedureColumns, dan SQLSpecialColumns

Nilai kolom berikut dikembalikan untuk jenis tanggal/waktu:

Jenis Kolom date waktu smalldatetime datetime tanggalwaktu2 tanggalwaktulewat
DATA_TYPE SQL_WVARCHAR SQL_WVARCHAR SQL_TYPE_TIMESTAMP SQL_TYPE_TIMESTAMP SQL_WVARCHAR SQL_WVARCHAR
TYPE_NAME date waktu smalldatetime datetime tanggalwaktu2 tanggalwaktulewat
COLUMN_SIZE 10 8,10..16 16 23 19, 21..27 26, 28..34
BUFFER_LENGTH 20 16, 20..32 16 16 38, 42..54 52, 56..68
DECIMAL_DIGITS NULL NULL 0 3 NULL NULL
SQL_DATA_TYPE SQL_WVARCHAR SQL_WVARCHAR SQL_DATETIME SQL_DATETIME SQL_WVARCHAR SQL_WVARCHAR
SQL_DATETIME_SUB NULL NULL SQL_CODE_TIMESTAMP SQL_CODE_TIMESTAMP NULL NULL
CHAR_OCTET_LENGTH NULL NULL NULL NULL NULL NULL
SS_DATA_TYPE 0 0 111 111 0 0

SQLSpecialColumns tidak mengembalikan SQL_DATA_TYPE, SQL_DATETIME_SUB, CHAR_OCTET_LENGTH, atau SS_DATA_TYPE.

Metadata Tipe Data yang Dikembalikan oleh SQLGetTypeInfo

Nilai kolom berikut dikembalikan untuk jenis tanggal/waktu:

Jenis Kolom date waktu smalldatetime datetime tanggalwaktu2 tanggalwaktulewat
TYPE_NAME date waktu smalldatetime datetime tanggalwaktu2 tanggalwaktulewat
DATA_TYPE SQL_WVARCHAR SQL_WVARCHAR SQL_TYPE_TIMESTAMP SQL_TYPE_TIMESTAMP SQL_WVARCHAR SQL_WVARCHAR
COLUMN_SIZE 10 16 16 23 27 34
LITERAL_PREFIX ' ' ' ' ' '
LITERAL_SUFFIX ' ' ' ' ' '
CREATE_PARAMS NULL NULL NULL NULL NULL NULL
NULLABLE SQL_NULLABLE SQL_NULLABLE SQL_NULLABLE SQL_NULLABLE SQL_NULLABLE SQL_NULLABLE
CASE_SENSITIVE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE
DAPAT DICARI SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE
UNSIGNED_ATTRIBUTE NULL NULL NULL NULL NULL NULL
FXED_PREC_SCALE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE
AUTO_UNIQUE_VALUE NULL NULL NULL NULL NULL NULL
LOCAL_TYPE_NAME date waktu smalldatetime datetime tanggalwaktu2 tanggalwaktulewat
MINIMUM_SCALE NULL NULL 0 3 NULL NULL
MAXIMUM_SCALE NULL NULL 0 3 NULL NULL
SQL_DATA_TYPE SQL_WVARCHAR SQL_WVARCHAR SQL_DATETIME SQL_DATETIME SQL_WVARCHAR SQL_WVARCHAR
SQL_DATETIME_SUB NULL NULL SQL_CODE_TIMESTAMP SQL_CODE_TIMESTAMP NULL NULL
NUM_PREC_RADIX NULL NULL NULL NULL NULL NULL
INTERVAL_PRECISION NULL NULL NULL NULL NULL NULL
USERTYPE 0 0 12 22 0 0

Perilaku Server Tingkat Bawah

Saat terhubung ke instans server dari versi sebelumnya yang SQL Server 2008 (10.0.x), setiap upaya untuk menggunakan jenis server baru atau kode metadata terkait dan bidang deskriptor akan mengakibatkan SQL_ERROR dikembalikan. Catatan diagnostik akan dihasilkan dengan SQLSTATE HY004 dan pesan "Jenis data SQL tidak valid untuk versi server pada koneksi", atau dengan 07006 dan "Pelanggaran atribut jenis data terbatas".

Lihat Juga

Peningkatan Tanggal dan Waktu (ODBC)