J'utilise SQL dans Impala pour écrire cette requête. J'essaie de convertir une chaîne de date, stockée au format YYYYMMDD, en un format de date afin d'exécuter une requête comme celle-ci:
SELECT datadate,
session_info
FROM database
WHERE datadate >= NOW() - INTERVAL 5 DAY
ORDER BY datadate DESC;
Étant donné que le code >= NOW() - INTERVAL 5 DAY
ne fonctionnera pas avec la chaîne YYYYMMDD, j'aimerais trouver un moyen de convertir cela en un format de date qui fonctionnera avec ce type de requête. Ma pensée est que cela devrait ressembler à ceci (basé sur des questions similaires sur d'autres éditeurs de requêtes SQL), mais cela ne fonctionne pas dans Impala:
SELECT datadate,
session_info,
convert(datetime, '20141008', 102) AS session_date
FROM database
WHERE session_date >= NOW() - INTERVAL 5 DAY
ORDER BY session_date DESC;
Quelqu'un sait comment faire cela à Impala?
MODIFIER:
J'ai finalement trouvé une solution de travail au problème. Aucune des tentatives utilisant des configurations de CAST
ou CONVERT
ne fonctionnerait dans Impala, mais la requête ci-dessous résout le problème et est pleinement opérationnelle, permettant d'effectuer des calculs de date sur une colonne contenant des valeurs de chaîne:
SELECT datadate,
session_info
FROM database
WHERE datadate >= from_unixtime(unix_timestamp(now() - interval 5 days), 'yyyyMMdd')
GROUP BY datadate
ORDER BY datadate DESC;
Voir Littéraux d'horodatage sur http://www.cloudera.com/content/cloudera/en /documentation/cloudera-impala/latest/topics/impala_literals.html
Vous devez ajouter des tirets à votre chaîne pour qu'Impala puisse le convertir en date/horodatage. Vous pouvez le faire avec quelque chose comme:
concat_ws('-', substr(datadate,1,4), substr(datadate,5,2), substr(datadate,7) )
que vous pouvez utiliser à la place de datadate
dans votre expression.
Voie native:
to_timestamp(cast(date_number AS STRING), 'yyyyMMdd')