2017-08-11 2 views
1

Je travaille côté serveur (en utilisant SSH) dans psql, où je définis les variables en utilisant la commande 'set'. Ma préoccupation est la suivante: J'ai une requête où j'insère une chaîne de caractères (date) dans un datetime, mais une erreur de syntaxe est générée.PSQL: erreur de syntaxe lors de la transmission de la variable de date set dans datetime

Exemple simple:

SELECT 
    network_no, 
    program_no, 
    national_datetime. 
FROM 
    views 
WHERE 
    national_datetime 
    between ':from_date 06:00:00' 
    and ':to_date 05:59:59'::timestamp + '1 day'::interval 

Où from_date 'et 'to_date' ont été fixés en conséquence:

\set from_date 2017-07-10 
\set to_date 2017-07-16 

Je sais normalement avec les dates que vous êtes censé définir trois ensembles de apostrophes le lire correctement (je n'ai jamais cherché la raison), mais je donne cette date à un datetime, donc je me suis dit que l'utilisation d'apostrophes ne marcherait pas, mais j'ai cette erreur:

ERROR: invalid input syntax for type timestamp: ":from_date 06:00:00" 
LINE 40: between ':from_date 06:00:00' 

Normalement dans un script bash cela fonctionnerait car il ne fait que passer la valeur de chaîne littérale, mais dans ce cas, si je mets aucun ou un ensemble d'apostrophes autour des valeurs de date il ne passera pas la valeur (je suis en supposant que PSQL gère les variables set.

Je sais qu'il y a des façons de contourner cela, mais je cherche une raison pourquoi quelque chose comme ceci se produirait, et s'il y a un moyen simple de corriger la "syntaxe d'entrée invalide" - que ce soit par le casting une variable, en définissant la variable différemment, etc.

Merci d'avance!

Répondre

1

:from_date est une variable qui n'est pas une chaîne.

Voici une façon de le faire:

date :from_date + time ' 06:00:00' 

voir doc à https://www.postgresql.org/docs/9.2/static/functions-datetime.html

+0

Cela a parfaitement fonctionné. Une chose à noter pour tous ceux qui lisent ceci est que vous aurez toujours besoin de faire le triple jeu d'apostrophes lors de la définition d'une variable (ex: \ set from_date '' '2017-07-10' '') pour qu'elle soit lue correctement. En outre, le type résultant de la réponse ci-dessus sera implicitement calculé en tant qu'horodatage, donc si vous avez une logique d'intervalle à ajouter à cela, vous pouvez juste ajouter quelque chose comme (+ '1 jour' :: interval) au équation ainsi sans typecasting explicite. – swagardson