Hive/SparkSQL - 在表达式中从日期类型强制转换为时间戳

Hive/SparkSQL - Type Coercion from date to timestamp in an expression

当我 运行 在 Spark SQL 中查询 Hive 时,LHS (timestamp) <= RHS (date) 对于相同的值 '2013-09-30' 不被视为相等 。而 RHS 中 TIMESTAMPCAST 效果很好。

> SELECT CASE
           WHEN CAST(ADD_MONTHS(CAST('2013-09-30' AS DATE), +1) AS TIMESTAMP) <= ADD_MONTHS(CAST('2013-09-30' AS DATE), +1) 
            THEN 'less than or equal'
           ELSE 'greater'
       END AS TIMESTAMP_LTE_DATE
FROM
VALUES(1);
+---------------------+--+
| TIMESTAMP_LTE_DATE  |
+---------------------+--+
| greater             |
+---------------------+--+

我们有很多包含 DATETIMESTAMP 组合的表达式,所有查询都将动态生成。因此,很难在所有地方找到 CAST 列或值。

有没有办法自动将表达式中的 RHS/LHS 转换为 Hive/SparkSQL 中的更高数据类型(Type Coercion)?

也在 Oracle 11g 中尝试了类似的查询,它工作正常,转到 equal

感谢您的帮助!!

不幸的是 type coercion rules for TimestampType / DateType 比较是硬编码的,并将双方都转换为 StringType:

// Comparisons between dates and timestamps.
case p @ BinaryComparison(left @ TimestampType(), right @ DateType()) =>
  p.makeCopy(Array(Cast(left, StringType), Cast(right, StringType)))
case p @ BinaryComparison(left @ DateType(), right @ TimestampType()) =>
  p.makeCopy(Array(Cast(left, StringType), Cast(right, StringType)))

并且使用字典顺序日期表示,日期表示在同一日期的时间戳表示之前。