Interval Harfiah

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 menjelaskan sintaksis literal interval, yang perlu digunakan penulis driver untuk memvalidasi bidang SQL_CHAR selama konversi baik ke atau dari jenis data interval C.

Catatan

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

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; 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.

  • Ketika 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 detik pecahan opsional dalam tanda kurung, atau keduanya. Jika presisi terdepan dan presisi detik pecahan hadir untuk bidang detik, presisi tersebut dipisahkan oleh koma. Jika bidang detik memiliki presisi detik pecahan, bidang tersebut juga harus memiliki presisi terdepan.

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

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

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

  • 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 mencakup bidang HOUR dan bidang urutan bawah (MENIT dan DETIK), 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 awal interval yang diekspresikan atau tersirat.

    • Bagian pecahan dari bidang SECOND dapat selama presisi detik yang diekspresikan 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}

Klausa escape literal 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' YEAR(3) TO MONTH} Menentukan interval 163 tahun dan 11 bulan. Presisi terdepan interval adalah 3.
{INTERVAL '163 12' HARI(3) HINGGA JAM} 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' MENIT(3) HINGGA DETIK(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:

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

{INTERVAL '223.16' SECOND(3,1)}
Dalam contoh pertama, presisi terdepan 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 literal yang ditentukan.
{INTERVAL '22.1234567' SECOND} Presisi detik tidak ditentukan, sehingga defaultnya menjadi 6. Harfiah memiliki tujuh digit setelah titik desimal.
{INTERVAL '163-13' YEAR(3) TO MONTH}

{INTERVAL '163 65' HARI(3) HINGGA JAM}

{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' MENIT(3) HINGGA DETIK(5)}
Bidang berikutnya tidak mengikuti aturan kalender Gregorian.