当我在Spark SQL中运行Hive查询时,LHS (timestamp
) <=
RHS (date
)对于相同的值'2013-09-30'
不视为相等。而TIMESTAMP
的CAST
在RHS中表现良好。
> 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 |
+---------------------+--+
我们有这么多的表达式与DATE
和TIMESTAMP
的组合,更多的查询将动态生成。所以,很难在所有的地方找到和CAST
列或值。
是否有一种方法来自动转换RHS/LHS表达式到更高的数据类型(类型强制转换)在Hive/SparkSQL ?
在Oracle 11g中也尝试了类似的查询,它可以很好地运行到equal
。
不幸的是,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)))
和按字典顺序排列的日期表示法中,日期表示法在同一日期的时间戳表示法之前。