使用DATEDIFF计算时间戳间隔天数触发as语法错误如何解决
错误原因
- 前两条SQL存在语法错误:
DATEDIFF是内置计算函数,仅接收计算所需的参数值,函数内部参数位置不允许使用AS关键字。AS仅可用于给SELECT返回的字段指定别名,需放在完整的计算表达式之后,不能出现在函数入参中。 - 第三条SQL存在兼容性风险:你在SELECT开头将原时间戳字段转成DATE类型后复用了原字段名作为别名,部分SQL引擎的执行顺序中,SELECT子句中后面的计算会优先读取原表的原始字段,而非前面定义的别名,如果原字段是非DATE类型,仍可能触发类型不匹配报错。另外不同SQL引擎的
DATEDIFF参数规则存在差异,未适配对应引擎的语法也会触发报错。
修正方案
不同常用引擎的修正写法如下:
适配Spark SQL/Presto/Trino等支持三参数DATEDIFF的引擎
参数顺序为DATEDIFF(时间单位, 起始日期, 结束日期),写法如下:
SELECT CAST(start_date AS DATE) AS start_date, CAST(end_date AS DATE) AS end_date, DATEDIFF(day, CAST(start_date AS DATE), CAST(end_date AS DATE)) AS diff_days FROM "test"."question_five_temp_table";
适配MySQL等仅支持双参数DATEDIFF的引擎
参数顺序为DATEDIFF(结束日期, 起始日期),默认返回间隔天数,写法如下:
SELECT CAST(start_date AS DATE) AS start_date, CAST(end_date AS DATE) AS end_date, DATEDIFF(CAST(end_date AS DATE), CAST(start_date AS DATE)) AS diff_days FROM "test"."question_five_temp_table";
如果不需要保留转换后的start_date、end_date字段,可直接去掉对应行,只保留间隔计算字段即可。
内容的提问来源于stack exchange,提问作者KatH.
相关产品推荐
相关产品推荐

