我探索了很多。我正在使用它来将纪元时间转换为日期:
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条语句失败。
有人可以帮我吗?我们如何指定时区,或者是否有其他方法可以解决此问题?
答案 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