什么是" DATE"在date_sub(DATE字符串,int)吗?

时间:2017-02-17 06:07:25

标签: sql hive hiveql

我遇到了以下行,无法理解为什么会这样。

where cast(date_str as date) between date_sub(date '{start_date_str}', 28) 
and date_sub(date '{start_date_str}', 1)

根据Hive文档,date_sub的第一个参数应该是一个字符串。那么为什么作者明确地在2个字符串前加上date个关键字?

类型转换的语法糖是wanted_type expr吗?根据Hive文档,正确的强制语法应该是cast(expr as wanted_type)

1 个答案:

答案 0 :(得分:1)

谢谢你的提问。
我刚刚更新了LanguageManual UDF页面

  1. 注意日期文字的ISO / ANSI方式是DATE 'YYYY-MM-DD'
  2. 在Hive的开头,不支持date类型,因此日期函数使用了string个参数。

  3. 文档似乎已过时,目前date_adddate_sub除了stringdatetimestamp作为第一个参数。< / p>

  4. GenericUDFDateSub.java

    .
    .
    .
    public class GenericUDFDateSub extends GenericUDFDateAdd {
      private transient SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    
      public GenericUDFDateSub() {
        this.signModifier = -1;
      }
    .
    .
    .
    

    GenericUDFDateAdd.java

    .
    .
    .
    switch (inputType1) {
    case STRING:
    case VARCHAR:
    case CHAR:
      inputType1 = PrimitiveCategory.STRING;
      dateConverter = ObjectInspectorConverters.getConverter(
        (PrimitiveObjectInspector) arguments[0],
        PrimitiveObjectInspectorFactory.writableStringObjectInspector);
      break;
    case TIMESTAMP:
      dateConverter = new TimestampConverter((PrimitiveObjectInspector) arguments[0],
        PrimitiveObjectInspectorFactory.writableTimestampObjectInspector);
      break;
    case DATE:
      dateConverter = ObjectInspectorConverters.getConverter(
        (PrimitiveObjectInspector) arguments[0],
        PrimitiveObjectInspectorFactory.writableDateObjectInspector);
      break;
    default:
      throw new UDFArgumentException(
        " DATE_ADD() only takes STRING/TIMESTAMP/DATEWRITABLE types as first argument, got "
        + inputType1);
    }
    .
    .
    .