【问题标题】:Declare variables in redshift and use it in the select query在redshift中声明变量并在select查询中使用
【发布时间】:2021-04-13 16:41:55
【问题描述】:

我正在尝试声明变量并在我的 sql 查询中使用它,如下所示,但它给了我错误:

-- this will get the the timestamp in seconds
DECLARE @startTimeStamp bigint = cast(DATEDIFF(s, '1970-01-01 00:00:00.000', '2016-12-09 16:22:17.897' ) as bigint)
DECLARE @endTimeStamp bigint = cast(DATEDIFF(s, '1970-01-01 00:00:00.000', '2016-12-10 16:22:17.897' ) as bigint)

-- my query.
SELECT processId,
houroftheday,
minuteofhour,
listagg(clientId, ',') within group (order by minuteofhour) as clientIds,
count(*) as psg
FROM data.process
where kite = 'BULLS'
and code is null
and timestampinepochsecond >= @startTimeStamp  AND  timestampinepochsecond < @endTimeStamp
group by 1, 2, 3

我读了它here,因为这是不可能的,所以我怎样才能重写我的上述查询,以便它可以正常工作?我尝试了他们的示例,但在转换时遇到了问题。

以下是我尝试过的,但出现语法错误:

CREATE TEMP TABLE tmp_variables AS SELECT 
   cast(DATEDIFF(s, '1970-01-01 00:00:00.000', '2016-12-09 16:22:17.897' ) as bigint) AS StartDate, 
   cast(DATEDIFF(s, '1970-01-01 00:00:00.000', '2016-12-10 16:22:17.897' ) as bigint)      AS EndDate;

这是我的demo,它给出了错误:

【问题讨论】:

  • 请发布您遇到的错误。
  • 这是我的demo

标签: sql amazon-web-services amazon-redshift


【解决方案1】:

所以 Redshift 不完全是 Postgres 并且 Postgres 没有 DATEDIFF 所以你的 dbfiddle 例子没有帮助。我运行了您在 Redshift 上提供的代码并收到以下错误消息:

[Amazon](500310) Invalid operation: function pg_catalog.date_diff(character varying, character varying, character varying) does not exist;

这基本上说明了问题“1970-01-01 00:00:00.000”不是时间戳,而是文本字符串。这需要转换为时间戳以供 DATEDIFF 使用。

DATEDIFF 返回一个 bigint,因此不需要转换为 bigint。

此外,已经有一个内置函数可以获取自纪元 (1/1/1970) 以来的秒数 - DATEPART()。像这样:

date_part(epoch, '2016-12-09 16:22:17.897'::timestamp)

现在 DATEPART 返回一个 DOUBLE 数据类型,因此如果您不想要亚秒级信息,您可能希望将其转换为 BIGINT。

如果你喜欢你的风格,它会像这样工作:

CREATE TEMP TABLE tmp_variables AS SELECT 
   cast(DATEDIFF(s, '1970-01-01 00:00:00.000'::timestamp, '2016-12-09 16:22:17.897'::timestamp ) as bigint) AS StartDate, 
   cast(DATEDIFF(s, '1970-01-01 00:00:00.000'::timestamp, '2016-12-10 16:22:17.897'::timestamp ) as bigint)      AS EndDate,
   5556::BIGINT       AS some_id;

【讨论】:

  • 感谢您的建议。我试过了,但还是不行。我在我的演示和同样的问题上完全复制了你的建议。这是新的demo
  • 哦,对不起,你的意思是说它不会在演示中运行,因为它使用 postgresql 嗯
  • 是的。 Redshift 从 V8.0 上的 Postgres 分离(很久以前)。即便如此,由于 Redshift 的集群列式架构,支持的 SQL 仍然存在显着差异。从那时起,Redshift 添加了来自其他数据库的特性/功能,例如 datediff()。如果您需要 SQL 在 Redshift 和 Postgres 仿真器中工作,您只需要使用可用于计算相同结果的常用函数,例如 EXTRACT() - extract(epoch, '2016-12-09 16:22: 17.897'::timestamp) - 见:dbfiddle.uk/…
  • 是的,在演示中它看起来不错,但由于某种原因,当我尝试在后台使用 redshift 的内部公司应用程序时 - 它给了我一个错误 - SYNTAX_ERROR :: Invalid operation: relation "tmp_variables" does not exist;。任何想法为什么会这样?我尝试了与您在演示中使用的完全相同的查询。
  • 还有什么方法可以将两个日期直接放在我的 sql 查询中,而不是将其存储在临时表中然后使用它?喜欢-and timestampinepochsecond &gt;= startDate AND timestampinepochsecond &lt; endDate。如果这个临时表的东西在内部对我们不起作用,我只是在探索其他选择。
猜你喜欢
  • 2020-10-10
  • 2011-11-25
  • 2015-08-29
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
相关资源
最近更新 更多