【问题标题】:Hive dates: date 'yyyy-MM-dd' vs. 'yyyy-MM-dd' What is the difference?Hive dates: date 'yyyy-MM-dd' vs. 'yyyy-MM-dd' 有什么区别?
【发布时间】:2020-12-14 13:33:24
【问题描述】:
将 hive 日期称为 date '2020-08-25' 与仅使用 '2020-08-25' 而不使用 date 有什么区别?是两种不同的数据类型吗?还是这些完全相同。我可能会将其放入如下的 where 语句中:
where somedate<=date'2020-08-25'
对比
where somedate<='2020-08-25'
【问题讨论】:
标签:
sql
date
hive
hiveql
where-clause
【解决方案1】:
date'2020-08-25' 是标准日期文字:它生成date 数据类型的合法值。
另一方面,'2020-08-25' 是一个文字字符串(表示日期,但也可以是其他任何东西)。
现在,where 子句中谓词的最佳选择是什么?这取决于您要比较的列的数据类型。
如果您有 date 列,那么我建议您使用文字日期。否则,您将依赖数据库理解您的意思的能力,并将字符串隐式转换为日期。每个数据库都有自己的一套规则来处理这种情况:在最坏的情况下,它可能做出错误的决定并决定进行字符串比较,这需要将所有存储的值转换为字符串(这取决于根据数据库规范) - 这会降低查询的性能。
如果您碰巧将日期存储为字符串(这通常表明设计不佳),那么字符串比较就可以了。
【解决方案2】:
date '2020-08-25' 是 DATE 类型的文字。
'2020-08-25' - 是一个字符串字面量。
字符串和日期可以隐式转换,因此您的两个 where 子句在功能上是相同的。根据列数据类型,可能会发生隐式转换。最好使用相同的类型,避免隐式转换。
DATE 也可以以二进制格式打包成 4 字节整数。见HIVE-3910