将时间从一个时间戳字段添加到另一个字段

Posted

技术标签:

【中文标题】将时间从一个时间戳字段添加到另一个字段【英文标题】:adding time from one timestamp field to other field 【发布时间】:2015-10-07 11:56:37 【问题描述】:

我正在尝试添加从用户初始日期到当前日期的时间(小时、分钟和秒),但收到错误消息。

我不知道我做错了什么,欢迎其他建议

select distinct uid,
       min (ts) over (partition by uid order by ts rows unbounded preceding) as initial_date,
       current_date-2 + interval 'to_char(min (ts) over (partition by uid order by ts rows unbounded preceding),'HH') hours'
  from mr_session_log
where ts >= '2015-09-01'

这是我收到的错误

ERROR: syntax error at or near "') hours'"

位置:355

current_date-2 + interval 'to_char(min (ts) over (partition by uid order by ts rows unbounded preceding),'HH') hours',
                                                                                                               ^

【问题讨论】:

current_date-2?那是标识符名称还是您试图从该字段中减去某些内容?语法高亮也能很好地提示问题所在,但您仍应始终发布错误消息。 嗨,我添加了错误,current_date - 2 从 current_date 减少了 2 天 【参考方案1】:

你不应该过度设计解决方案,语法高亮清楚地表明你不能把函数放在间隔中,当你想要不同的 uid 和按 uid 分区时,不需要窗口函数。

SELECT uid, (current_date -2 ) + min(ts::time)
FROM mr_session_log
WHERE ts >= '2015-09-01'
GROUP BY uid
ORDER BY uid;

【讨论】:

我可以用windows功能做到这一点,因为我在选择中有更多的字段吗? @user3600910 当然,最重要的部分是日期/时间操作,对吧?你应该能够弄清楚其余的。 @user3600910 可能会尝试使用带有窗口函数的子查询,然后在更高级别完成所需的其余工作【参考方案2】:

如果你真的需要使用窗口功能也很简单:

SELECT DISTINCT
    uid,
    CURRENT_DATE - 2 - MIN(ts::time) OVER (PARTITION BY uid
                                     ORDER BY ts
                                     ROWS UNBOUNDED PRECEDING) AS date_with_added_time
FROM mr_session_log
WHERE ts >= '2015-09-01'::DATE;

如果您只需要小时、分钟和秒,请使用 MIN(date_trunc('secconds', ts)::time) 而不是 MIN(ts::time)

【讨论】:

我需要将时间添加到 current_date -2,这就是我使用 to_chat 的原因 @user3600910 我已经更正了我的答案 - 你只需要将 timestamp 转换为 time 或使用 date_trunc(text, timestamp) 如果毫秒数无用

以上是关于将时间从一个时间戳字段添加到另一个字段的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Flutter 将文档创建时间戳添加到 Firestore [重复]

如何避免向表中添加时间戳字段? [关闭]

蜂巢时间戳不接受 Spark 时间戳类型

将列上的纪元时间保存到另一列 postgres

将系统时间戳插入配置单元表中的时间戳字段

将时间戳从 Dataframe 加载到 BigQuery 数据集