Littéraux d’intervalle
ODBC exige que tous les pilotes prennent en charge la conversion du type de données SQL_CHAR ou SQL_VARCHAR en tous les types de données d’intervalle C. Si la source de données sous-jacente ne prend pas en charge les types de données d’intervalle, toutefois, le pilote doit connaître le format correct de la valeur dans le champ SQL_CHAR afin de prendre en charge ces conversions. De même, ODBC exige que tout type ODBC C soit convertible en SQL_CHAR ou SQL_VARCHAR. Par conséquent, un pilote doit savoir quel format un intervalle stocké dans le champ caractère doit avoir. Cette section décrit la syntaxe des littéraux d’intervalle, que l’enregistreur de pilotes doit utiliser pour valider les champs SQL_CHAR lors de la conversion vers ou depuis des types de données d’intervalle C.
Remarque
La syntaxe BNF complète pour les littéraux d’intervalle est affichée dans la section Syntaxe littérale de l’intervalle dans l’annexe C : Grammaire SQL.
Pour passer des littéraux d’intervalle dans le cadre d’une instruction SQL, une syntaxe de clause d’échappement est définie pour les littéraux d’intervalle. Pour plus d’informations, consultez Littéraux date, heure et horodatage.
Un littéral d’intervalle est de la forme :
INTERVAL[<sign>] 'value' <interval qualifier>
où « INTERVAL » indique que le littéral de caractère est un intervalle. Le signe peut être plus ou moins ; elle est en dehors de la chaîne d’intervalle et est facultative.
Le qualificateur d’intervalle peut être un champ datetime unique ou être composé de deux champs datetime, sous la forme : <champ de fin de champ> de début TO><.
Lorsque l’intervalle est composé d’un seul champ, le champ unique peut être un champ non seconde qui peut être accompagné d’une précision de début facultative entre parenthèses. Le champ datetime unique peut également être un deuxième champ qui peut être accompagné par la précision de début facultative, la précision fractionnaires facultative en parenthèses, ou les deux. Si une précision de début et une précision fractionnaire en secondes sont présentes pour un champ de secondes, elles sont séparées par des virgules. Si le champ de secondes a une précision fractionnaire en secondes, il doit également avoir une précision de début.
Lorsque l’intervalle est composé de champs de début et de fin, le champ de début est un champ non seconde qui peut être accompagné de la précision du champ de début d’intervalle entre parenthèses. Le champ de fin peut être un champ non seconde ou un second champ qui peut être accompagné d’une précision fractionnaire de secondes d’intervalle entre parenthèses.
La chaîne d’intervalle dans la valeur est placée entre guillemets simples. Il peut s’agir d’un littéral d’un mois d’année ou d’un littéral de jour. Le format de la chaîne en valeur est déterminé par les règles suivantes :
La chaîne contient une valeur décimale pour chaque champ implicite par le <qualificateur> d’intervalle.
Si la précision de l’intervalle inclut les champs YEAR et MONTH, les valeurs de ces champs sont séparées par un signe moins.
Si la précision de l’intervalle inclut les champs DAY et HOUR, les valeurs de ces champs sont séparées par un espace.
Si la précision de l’intervalle inclut le champ HEURE et les champs d’ordre inférieur (MINUTE et SECOND), les valeurs de ces champs sont séparées par un signe deux-points.
Si la précision d’intervalle inclut un champ SECOND et que la précision exprimée ou implicite en secondes n’est pas égale à zéro, le caractère juste avant le premier chiffre de la partie fractionnaire de la seconde est une période.
Aucun champ ne peut être long de plus de deux chiffres, sauf :
La valeur du champ de début peut être aussi longue que la précision de début de l’intervalle exprimé ou implicite.
La partie fractionnaire du champ SECOND peut être aussi longue que la précision exprimée ou implicite des secondes.
Les champs de fin suivent les contraintes habituelles du calendrier grégorien. (Voir Contraintes du calendrier grégorien.)
Le tableau suivant répertorie des exemples de littéraux d’intervalle valides, comme inclus dans la clause d’échappement ODBC pour les intervalles. La syntaxe de la clause d’échappement est la suivante :
Remarque
{INTERVAL sign interval-string interval-qualifier}
Clause d’échappement littérale | Intervalle spécifié |
---|---|
{INTERVAL '326' YEAR(4)} | Spécifie un intervalle de 326 ans. La précision de début de l’intervalle est 4. |
{INTERVAL '326' MONTH(3)} | Spécifie un intervalle de 326 mois. La précision de début de l’intervalle est 3. |
{INTERVAL '3261' DAY(4)} | Spécifie un intervalle de 3261 jours. La précision de début de l’intervalle est 4. |
{INTERVAL '163' HOUR(3)} | Spécifie un intervalle de 163 jours. La précision de début de l’intervalle est 3. |
{INTERVAL '163' MINUTE(3)} | Spécifie un intervalle de 163 minutes. La précision de début de l’intervalle est 3. |
{INTERVAL '223.16' SECOND(3,2)} | Spécifie un intervalle de 223,16 secondes. La précision de début de l’intervalle est 3, et la précision des secondes est de 2. |
{INTERVAL '163-11' YEAR(3) TO MONTH} | Spécifie un intervalle de 163 ans et 11 mois. La précision de début de l’intervalle est 3. |
{INTERVAL '163 12' DAY(3) TO HOUR} | Spécifie un intervalle de 163 jours et 12 heures. La précision de début de l’intervalle est 3. |
{INTERVAL '163 12:39' DAY(3) TO MINUTE} | Spécifie un intervalle de 163 jours, 12 heures et 39 minutes. La précision de début de l’intervalle est 3. |
{INTERVAL '163 12:39:59.163' DAY(3) TO SECOND(3)} | Spécifie un intervalle de 163 jours, 12 heures, 39 minutes et 59,163 secondes. La précision de début de l’intervalle est 3, et la précision des secondes est 3. |
{INTERVAL '163:39' HOUR(3) TO MINUTE} | Spécifie un intervalle de 163 heures et 39 minutes. La précision de début de l’intervalle est 3. |
{INTERVAL '163:39:59.163' HOUR(3) TO SECOND(4)} | Spécifie un intervalle de 163 heures, 39 minutes et 59,163 secondes. La précision de début de l’intervalle est 3, et la précision des secondes est de 4. |
{INTERVAL '163:59.163' MINUTE(3) TO SECOND(5)} | Spécifie un intervalle de 163 minutes et 59,163 secondes. La précision de début de l’intervalle est 3, et la précision des secondes est de 5. |
{INTERVAL -'16 23:39:56.23' DAY TO SECOND} | Spécifie un intervalle de moins 16 jours, 23 heures, 39 minutes et 56,23 secondes. La précision de début implicite est 2, et la précision implicite des secondes est 6. |
Le tableau suivant répertorie des exemples de littéraux d’intervalle non valides :
Clause d’échappement littérale | Raison pour laquelle la valeur n’est pas valide |
---|---|
{INTERVAL '163' HOUR(2)} | La précision de début de l’intervalle est 2, mais la valeur du champ de début est 163. |
{INTERVAL '223.16' SECOND(2,2)} {INTERVAL '223.16' SECOND(3,1)} |
Dans le premier exemple, la précision de début est trop petite et, dans le deuxième exemple, la précision des secondes est trop petite. |
{INTERVAL '223.16' SECOND} {INTERVAL '223' YEAR} |
Étant donné que la précision de début n’est pas spécifiée, la valeur par défaut est 2, qui est trop petite pour contenir le littéral spécifié. |
{INTERVAL '22.1234567' SECOND} | La précision des secondes n’est pas spécifiée. Par conséquent, elle a la valeur 6 par défaut. Le littéral a sept chiffres après la virgule décimale. |
{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)} |
Le champ de fin ne suit pas les règles du calendrier grégorien. |