使用DATEADD

时间:2019-09-05 09:20:21

标签: sql amazon-redshift dateadd json-extract

我探索了很多。我正在使用它来将纪元时间转换为日期:

CASE 
  WHEN json_extract_path_text(cli, 'pickupDate') IS NULL OR json_extract_path_text(cli, 'pickupDate') = '' 
  THEN DATEADD(SECOND, CONVERT(bigint, json_extract_path_text(cli, 'pickupTime')), '1970-1-1'), '1970-1-1' ) 
  ELSE json_extract_path_text(cli, 'pickupDate') 
END AS "Start Date"

为了提供些许上下文,如果json中的键“ pickupDate”不存在,我需要利用此键“ pickUpTime”来获取值。当我这样做时,出现此错误:

  

无效操作:CASE类型的文本和没有时区的时间戳无法匹配;       1条语句失败。

有人可以帮我吗?我们如何指定时区,或者是否有其他方法可以解决此问题?

2 个答案:

答案 0 :(得分:0)

尝试将其分解为多个部分,以查看问题所在。

此表达式有效吗?

DATEADD(SECOND, CONVERT(bigint, json_extract_path_text(cli, 'pickupTime')),'1970-1-1')

如果确实如此,则尝试查找前一个表达式的结果数据类型以及该表达式的数据类型,以查看它们是否匹配:json_extract_path_text(cli, 'pickupDate')

如果可行,请尝试使用DATE '1970-1-1'前缀将DATE声明为日期。

虽然也不确定,但是您在上面发布的表达式中似乎还有一个括号。

答案 1 :(得分:0)

错误消息非常清楚-您无法从case表达式返回两种不兼容的数据类型。

case表达式必须从其所有分支中返回兼容的数据类型,因此仅从else部分的josn中读取文本是不够的,您仍然需要将其转换为datetime
我不熟悉Amazon redshift的具体细节,但我猜您需要convert