0

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

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 个语句失败。

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

4

2 回答 2

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

另外,不确定,但您在上面发布的表达式中似乎有一个额外的括号。

于 2019-09-05T09:32:55.953 回答
0

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

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

于 2019-09-05T09:34:54.037 回答