将时间从一个时间戳字段添加到另一个字段
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)
如果毫秒数无用以上是关于将时间从一个时间戳字段添加到另一个字段的主要内容,如果未能解决你的问题,请参考以下文章