web-dev-qa-db-fra.com

Presto - date et horodatage statiques dans la clause where

Je suis à peu près sûr que la requête suivante fonctionnait pour moi sur Presto:

select segment, sum(count)
from modeling_trends
where segment='2557172' and date = '2016-06-23' and count_time between '2016-06-23 14:00:00.000' and '2016-06-23 14:59:59.000';
group by 1;

maintenant, quand je l'exécute (sur Presto 0.147 sur EMR), j'obtiens une erreur en essayant d'affecter varchar à date/timestamp ..

Je peux le faire fonctionner en utilisant:

select segment, sum(count)
from modeling_trends
where segment='2557172' and date = cast('2016-06-23' as date) and count_time between cast('2016-06-23 14:00:00.000' as TIMESTAMP) and cast('2016-06-23 14:59:59.000' as TIMESTAMP)
group by segment;

mais ça a l'air sale ... y a-t-il une meilleure façon de faire ça?

30
Tal Joffe

Contrairement à d'autres bases de données, Presto ne convertit pas automatiquement entre varchar et d'autres types, même pour les constantes. Le cast fonctionne, mais un moyen plus simple consiste à utiliser les constructeurs de types:

WHERE segment = '2557172'
  AND date = date '2016-06-23'
  AND count_time BETWEEN timestamp '2016-06-23 14:00:00.000' AND timestamp '2016-06-23 14:59:59.000'

Vous pouvez voir des exemples pour différents types ici: https://prestosql.io/docs/current/language/types.html

52
David Phillips