日期数学不会在 R 与 Redshift 中产生相同的结果

Posted

技术标签:

【中文标题】日期数学不会在 R 与 Redshift 中产生相同的结果【英文标题】:Dates math does not result in same results in R vs. Redshift 【发布时间】:2019-04-26 14:22:44 【问题描述】:

我在使用 RPostgres 包连接 Redshift 时遇到问题。我不确定这是否是我们的数据库设置的问题,或者它是否是包的已知问题。

当我在 Redshift 中使用相同的查询与在 R 中使用 RPostgres 包时使用相同的查询,我得到了不同的结果。

这完全是由于日期数学,因为我的总行数匹配,以及其他一切,当不使用日期时。

例如,这可能是我在 Redshift 中运行的查询(使用元数据库)。如果我在 R 中使用 RPostgres 包运行相同的精确查询,我将得到完全不同的结果。

SELECT
orders.*
FROM
orders
WHERE 
orders.date >= current_date-3
AND 
orders.date < current_date-2

元数据库中的日期是有意义的。它只显示一天,三天前。但是,在 R 中,它显示 2 天。

就本示例而言,将日期视为时间戳

有没有人遇到过这个问题,或者知道存在的问题并解决了?

【问题讨论】:

orders.date 是带时区还是不带时区的时间戳?使用 Redshift 和 R 时客户端的时区是否相同? 只是一个时间戳。查询是否出于某种原因转换为 R 中的时区?在客户端,它是一个没有时区的时间戳。奇怪的是,如果我拉一个人跟客户比较,日期和时间是完全一样的。 杰里米,你是对的。一切都休息4小时。因此,如果我在 WHERE 子句中指定:orders.date BETWEEN '04/22/2019 4:00:00' AND '04/23/2019 3:59:59',我将仅在 4 月 22 日收到订单。无需在客户端执行此操作,并且输出与客户端匹配,所以我仍然不确定包为什么会这样做。我确信有更好的解决方法,convert_timezone 等。所以我会留下这个问题以获得更好的解释。 "current_date" 在 Redshift 中不返回时间戳值,它仅返回一个 date,基于当前 session 的时区。如果您将此与时间戳值进行比较,则将使用“00:00:00”的时间分量。您可能需要使用 SET TIMEZONE = '';在两个脚本的开头,以确保您将同类与同类进行比较。 【参考方案1】:

通常最好是绝对明确的日期,以确保会话设置不会无意中影响查询。试试这个:

SELECT
orders.*
FROM
orders
WHERE 
orders.date >= date_trunc('day', current_timestamp at time zone 'utc') - '3 days'::interval
AND 
orders.date < date_trunc('day', current_timestamp at time zone 'utc') - '2 days'::interval

如果您的日期隐式存储在不同的时区,您可能需要从 utc 更改时区。

【讨论】:

以上是关于日期数学不会在 R 与 Redshift 中产生相同的结果的主要内容,如果未能解决你的问题,请参考以下文章

Redshift COPY Statement 日期加载错误

昨天 - 在 Redshift 和 PostgreSQL 中 - 日期添加兼容性

填写缺失的日期 Redshift

当我尝试将 R 与 AWS Redshift 连接时,我收到了一个找不到类的错误

$\lambda = 0$ 和 OLS 的 LASSO 在 R glmnet 中产生不同的结果

使用 AWS 驱动程序与 Redshift 的 R 连接不起作用,但可以与 Postgre 驱动程序一起使用