Bagikan melalui


Konversi Tipe Data tanggalwaktu dari C ke SQL

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

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

Konversi yang dijelaskan dalam tabel berikut berlaku untuk konversi yang dilakukan pada klien. Dalam kasus di mana klien menentukan presisi kedua pecahan untuk parameter yang berbeda dari yang ditentukan di server, konversi klien mungkin berhasil tetapi server akan mengembalikan kesalahan ketika SQLExecute atau SQLExecuteDirect dipanggil. Secara khusus, ODBC memperlakukan pemotongan detik pecahan sebagai kesalahan, sedangkan perilaku SQL Server adalah untuk membulatkan; misalnya, pembulatan terjadi saat Anda mulai dari datetime2(6) hingga datetime2(2). Nilai kolom tanggalwaktu dibulatkan ke 1/300 dari kolom detik dan smalldatetime memiliki detik yang diatur ke nol oleh server.

SQL_TYPE_DATE SQL_TYPE_TIME SQL_SS_TIME2 SQL_TYPE_TIMESTAMP SQL_SS_TIMSTAMPOFFSET SQL_CHAR SQL_WCHAR
SQL_C_DATE 1 - - 1,6 1,5,6 1,13 1,13
SQL_C_TIME - 1 1 1,7 1,5,7 1,13 1,13
SQL_C_SS_TIME2 - 1,3 1,10 1,7 1,5,7 1,13 1,13
SQL_C_BINARY(SQL_SS_TIME2_STRUCT) T/A T/A 1,10,11 T/A T/A T/A T/A
SQL_C_TYPE_TIMESTAMP 1,2 1,3,4 1,4,10 1,10 1,5,10 1,13 1,13
SQL_C_SS_TIMESTAMPOFFSET 1,2,8 1,3,4,8 1,4,8,10 1,8,10 1,10 1,13 1,13
SQL_C_BINARY(SQL_SS_TIMESTAMPOFFSET_STRUCT) T/A T/A T/A T/A 1,10,11 T/A T/A
SQL_C_CHAR/SQL_WCHAR (tanggal) 9 9 9 9,6 9,5,6 T/A T/A
SQL_C_CHAR/SQL_WCHAR (time2) 9 9,3 9,10 9,7,10 9,5,7,10 T/A T/A
SQL_C_CHAR/SQL_WCHAR (tanggalwaktu) 9,2 9,3,4 9,4,10 9,10 9,5,10 T/A T/A
SQL_C_CHAR/SQL_WCHAR (datetimeoffset) 9,2,8 9,3,4,8 9,4,8,10 9,8,10 9,10 T/A T/A
SQL_C_BINARY(SQL_DATE_STRUCT) 1.11 T/A T/A T/A T/A T/A T/A
SQL_C_BINARY(SQL_TIME_STRUCT) T/A T/A T/A T/A T/A T/A T/A
SQL_C_BINARY(SQL_TIMESTAMP_STRUCT) T/A T/A T/A T/A T/A T/A T/A

Kunci ke Simbol

  • -: Tidak ada konversi yang didukung. Rekaman diagnostik dihasilkan dengan SQLSTATE 07006 dan pesan "Pelanggaran atribut jenis data terbatas".

  • 1: Jika data yang disediakan tidak valid, rekaman diagnostik dihasilkan dengan SQLSTATE 22007 dan pesan "Format tanggalwaktu tidak valid".

  • 2: Bidang waktu harus nol atau catatan diagnostik dihasilkan dengan SQLSTATE 22008 dan pesan "Pemotongan pecahan".

  • 3: Detik pecahan harus nol atau catatan diagnostik dihasilkan dengan SQLSTATE 22008 dan pesan "Pemotongan pecahan".

  • 4: Komponen tanggal diabaikan.

  • 5: Zona waktu diatur ke pengaturan zona waktu klien.

  • 6: Waktu diatur ke nol.

  • 7: Tanggal diatur ke tanggal saat ini.

  • 8: Waktu dikonversi dari zona waktu klien ke UTC. Jika terjadi kesalahan selama konversi ini, rekaman diagnostik dihasilkan dengan SQLSTATE 22008 dan pesan "Meluap bidang Datetime".

  • 9: String diurai dan dikonversi ke nilai tanggal, tanggalwaktu, datetimeoffset, atau waktu, tergantung pada karakter tanda baca pertama yang ditemui dan adanya komponen yang tersisa. String kemudian dikonversi ke jenis target, mengikuti aturan dalam tabel sebelumnya untuk jenis sumber yang ditemukan oleh proses ini. Jika kesalahan terdeteksi saat mengurai data, rekaman diagnostik dihasilkan dengan SQLSTATE 22018 dan pesan "Nilai karakter tidak valid untuk spesifikasi cast". Untuk parameter datetime dan smalldatetime, jika tahun berada di luar rentang yang didukung oleh jenis ini, rekaman diagnostik dihasilkan dengan SQLSTATE 22007 dan pesan "Format tanggalwaktu tidak valid".

    Untuk datetimeoffset, nilai harus dalam rentang setelah konversi ke UTC, bahkan jika tidak ada konversi ke UTC yang diminta. Ini karena TDS dan server selalu menormalkan waktu dalam nilai datetimeoffset untuk UTC, sehingga klien harus memverifikasi bahwa komponen waktu berada dalam rentang yang didukung setelah konversi ke UTC. Jika nilai tidak berada dalam rentang UTC yang didukung, rekaman diagnostik dihasilkan dengan SQLSTATE 22007 dan pesan "Format tanggalwaktu tidak valid".

  • 10: Jika pemotongan dengan kehilangan data terjadi, rekaman diagnostik dihasilkan dengan SQLSTATE 22008 dan pesan "Format waktu tidak valid". Kesalahan ini juga terjadi jika nilai berada di luar rentang yang dapat diwakili oleh rentang UTC yang digunakan oleh server.

  • 11: Jika panjang byte data tidak sama dengan ukuran struktur yang diperlukan oleh jenis SQL, rekaman diagnostik dihasilkan dengan SQLSTATE 22003 dan pesan "Nilai numerik di luar rentang".

  • 12: Jika panjang byte data adalah 4 atau 8, data dikirim ke server dalam format smalldatetime TDS mentah atau tanggalwaktu. Jika panjang byte data sama persis dengan ukuran SQL_TIMESTAMP_STRUCT, data dikonversi ke format TDS untuk datetime2.

  • 13: Jika pemotongan dengan kehilangan data terjadi, rekaman diagnostik dihasilkan dengan SQLSTATE 22001 dan pesan "Data string, terpotong kanan".

    Jumlah digit detik pecahan (skala) ditentukan dari ukuran kolom tujuan sesuai dengan tabel berikut:

    Skala Tersirat Skala Tersirat
    Jenis 0 1..9
    SQL_C_TYPE_TIMESTAMP 19 21..29

    Namun, untuk SQL_C_TYPE_TIMESTAMP, jika detik pecahan dapat diwakili dengan tiga digit tanpa kehilangan data dan ukuran kolom adalah 23 atau lebih besar, maka tepat tiga digit detik pecahan dihasilkan. Perilaku ini memastikan kompatibilitas mundur untuk aplikasi yang dikembangkan menggunakan driver ODBC yang lebih lama.

    Untuk ukuran kolom yang lebih besar dari rentang dalam tabel, skala 9 tersirat. Konversi ini harus memungkinkan hingga sembilan digit detik pecahan, maksimum yang diizinkan oleh ODBC.

    Ukuran kolom nol menyiratkan ukuran tidak terbatas untuk jenis karakter panjang variabel di ODBC (9 digit, kecuali aturan 3 digit untuk SQL_C_TYPE_TIMESTAMP berlaku). Menentukan ukuran kolom nol dengan jenis karakter panjang tetap adalah kesalahan.

  • N/A: SQL Server 2005 (9.x) yang ada dan perilaku sebelumnya dipertahankan.

Lihat Juga

Peningkatan Tanggal dan Waktu (ODBC)