Interval Literals

ODBC mengharuskan semua driver mendukung konversi jenis data SQL_CHAR atau SQL_VARCHAR ke semua jenis data interval C. Namun, jika sumber data yang mendasar tidak mendukung jenis data interval, driver perlu mengetahui format nilai yang benar di bidang SQL_CHAR untuk mendukung konversi ini. Demikian pula, ODBC mengharuskan setiap jenis ODBC C dapat dikonversi ke SQL_CHAR atau SQL_VARCHAR, sehingga driver perlu mengetahui format apa yang harus dimiliki interval yang disimpan di bidang karakter. Bagian ini menguraikan sintaksis literal interval, yang perlu digunakan penulis driver untuk memvalidasi bidang SQL_CHAR selama konversi ke atau dari jenis data interval C.

Catatan

Sintaks BNF lengkap untuk literal interval ditampilkan di bagian Sintaks Literal Interval dalam Lampiran C: SQL Tata Bahasa.

Untuk meneruskan literal interval sebagai bagian dari pernyataan SQL, sintaks klausa escape didefinisikan untuk literal interval. Untuk informasi selengkapnya, lihat Literal Tanggal, Waktu, dan Tanda Waktu.

Interval literal adalah dari bentuk:

INTERVAL[<sign>] 'value' <interval qualifier>  

di mana "INTERVAL" menunjukkan bahwa karakter harfiah adalah interval. Tanda dapat berupa plus atau minus; itu berada di luar string interval dan bersifat opsional.

Kualifikasi interval dapat berupa bidang tanggalwaktu tunggal atau terdiri dari dua bidang tanggalwaktu, dalam formulir: < bidang >di depan ke <bidang> berikutnya.

  • Saat interval terdiri dari satu bidang, bidang tunggal bisa menjadi bidang non-detik yang mungkin disertai dengan presisi utama opsional dalam tanda kurung. Bidang tanggalwaktu tunggal juga dapat menjadi bidang kedua yang mungkin disertai dengan presisi utama opsional, presisi fraksional-detik opsional dalam tanda kurung, atau keduanya. Jika presisi terdepan dan presisi pecahan detik ada untuk bidang detik, presisi tersebut dipisahkan dengan koma. Jika bidang detik memiliki presisi pecahan detik, bidang tersebut juga harus memiliki presisi terdepan.

  • Ketika interval terdiri dari bidang di depan dan di belakang, bidang di depan adalah bidang non-detik yang mungkin disertai dengan presisi bidang awal interval dalam tanda kurung. Bidang berikutnya dapat berupa bidang non-detik atau bidang kedua yang mungkin disertai dengan presisi pecahan-detik interval dalam tanda kurung.

String interval dalam nilai diapit dalam tanda kutip tunggal. Ini bisa berupa harfiah sebulan tahun atau harfiah waktu sehari. Format string dalam nilai ditentukan oleh aturan berikut:

  • String berisi nilai desimal untuk setiap bidang yang tersirat oleh <intervalqualifier>.

  • Jika presisi interval menyertakan bidang YEAR dan MONTH, nilai bidang ini dipisahkan oleh tanda minus.

  • Jika presisi interval menyertakan bidang DAY dan HOUR, nilai bidang ini dipisahkan oleh spasi.

  • Jika presisi interval menyertakan bidang HOUR dan bidang urutan bawah (MINUTE dan SECOND), nilai bidang ini dipisahkan oleh titik dua.

  • Jika presisi interval mencakup bidang SECOND dan presisi detik yang dinyatakan atau tersirat bukan nol, karakter segera sebelum digit pertama dari bagian pecahan kedua adalah titik.

  • Tidak ada bidang yang panjangnya lebih dari dua digit, kecuali:

    • Nilai bidang utama dapat selama presisi terdepan interval yang diekspresikan atau tersirat.

    • Bagian pecahan dari bidang SECOND dapat selama presisi detik yang dinyatakan atau tersirat.

    • Bidang berikutnya mengikuti batasan kalender Gregorian yang biasa. (Lihat Batasan Kalender Gregorian.)

Tabel berikut mencantumkan contoh literal interval yang valid seperti yang disertakan dalam klausul escape ODBC untuk interval. Sintaks klausul escape adalah sebagai berikut:

Catatan

{INTERVAL sign interval-string interval-qualifier}

Klausul escape harfiah Interval ditentukan
{INTERVAL '326' YEAR(4)} Menentukan interval 326 tahun. Presisi terdepan interval adalah 4.
{INTERVAL '326' MONTH(3)} Menentukan interval 326 bulan. Presisi terdepan interval adalah 3.
{INTERVAL '3261' DAY(4)} Menentukan interval 3261 hari. Presisi terdepan interval adalah 4.
{INTERVAL '163' HOUR(3)} Menentukan interval 163 hari. Presisi terdepan interval adalah 3.
{INTERVAL '163' MINUTE(3)} Menentukan interval 163 menit. Presisi terdepan interval adalah 3.
{INTERVAL '223.16' SECOND(3,2)} Menentukan interval 223,16 detik. Presisi terdepan interval adalah 3, dan presisi detik adalah 2.
{INTERVAL '163-11' TAHUN(3) HINGGA BULAN} Menentukan interval 163 tahun dan 11 bulan. Presisi terdepan interval adalah 3.
{INTERVAL '163 12' DAY(3) TO HOUR} Menentukan interval 163 hari dan 12 jam. Presisi terdepan interval adalah 3.
{INTERVAL '163 12:39' DAY(3) TO MINUTE} Menentukan interval 163 hari, 12 jam, dan 39 menit. Presisi terdepan interval adalah 3.
{INTERVAL '163 12:39:59.163' DAY(3) TO SECOND(3)} Menentukan interval 163 hari, 12 jam, 39 menit, dan 59,163 detik. Presisi terdepan interval adalah 3, dan presisi detik adalah 3.
{INTERVAL '163:39' HOUR(3) TO MINUTE} Menentukan interval 163 jam dan 39 menit. Presisi terdepan interval adalah 3.
{INTERVAL '163:39:59.163' HOUR(3) TO SECOND(4)} Menentukan interval 163 jam, 39 menit, dan 59,163 detik. Presisi terdepan interval adalah 3, dan presisi detik adalah 4.
{INTERVAL '163:59.163' MINUTE(3) TO SECOND(5)} Menentukan interval 163 menit dan 59,163 detik. Presisi terdepan interval adalah 3, dan presisi detik adalah 5.
{INTERVAL -'16 23:39:56.23' HARI KE DETIK} Menentukan interval minus 16 hari, 23 jam, 39 menit, dan 56,23 detik. Presisi tersirat utama adalah 2, dan presisi detik tersirat adalah 6.

Tabel berikut ini mencantumkan contoh literal interval yang tidak valid:

Klausul escape harfiah Alasan mengapa tidak valid
{INTERVAL '163' HOUR(2)} Presisi terdepan interval adalah 2, tetapi nilai bidang utama adalah 163.
{INTERVAL '223.16' SECOND(2,2)}

{INTERVAL '223.16' SECOND(3,1)}
Dalam contoh pertama, presisi terkemuka terlalu kecil, dan dalam contoh kedua, presisi detik terlalu kecil.
{INTERVAL '223.16' SECOND}

{INTERVAL '223' YEAR}
Karena presisi terkemuka tidak ditentukan, defaultnya adalah 2, yang terlalu kecil untuk menahan harfiah yang ditentukan.
{INTERVAL '22.1234567' SECOND} Presisi detik tidak ditentukan, sehingga default ke 6. Harfiah memiliki tujuh digit setelah titik desimal.
{INTERVAL '163-13' YEAR(3) TO MONTH}

{INTERVAL '163 65' DAY(3) TO HOUR}

{INTERVAL '163 62:39' DAY(3) TO MINUTE}

{INTERVAL '163 12:125:59.163' DAY(3) TO SECOND(3)}

{INTERVAL '163:144' HOUR(3) TO MINUTE}

{INTERVAL '163:567:234.163' HOUR(3) TO SECOND(4)}

{INTERVAL '163:591.163' MINUTE(3) TO SECOND(5)}
Bidang berikutnya tidak mengikuti aturan kalender Gregorian.