PostgreSQL 中的 DATE ADD 函数

问题描述 投票:0回答:3

我目前在 Microsoft SQL Server 中有以下代码来获取连续两天查看的用户。

WITH uservideoviewvideo (date, user_id) AS (
  SELECT  DISTINCT date, user_id 
  FROM clickstream_videos
  WHERE event_name ='video_play'  
    and user_id IS NOT NULL
) 
SELECT currentday.date AS date, 
       COUNT(currentday.user_id) AS users_view_videos, 
       COUNT(nextday.user_id) AS users_view_next_day 
FROM userviewvideo currentday
  LEFT JOIN userviewvideo nextday 
         ON currentday.user_id = nextday.user_id AND DATEADD(DAY, 1, 
currentday.date) = nextday.date
GROUP BY currentday.date

我正在尝试让 DATEADD 函数在 PostgreSQL 中工作,但我一直无法弄清楚如何让它工作。有什么建议吗?

postgresql date-arithmetic
3个回答
14
投票

我不认为 PostgreSQL 真的有 DATEADD 函数。相反,只需这样做:

+ INTERVAL '1 day'

SQL 服务器:

在当前日期 2012 年 11 月 21 日基础上添加 1 天

SELECT DATEADD(day, 1, GETDATE());
#2012-11-22 17:22:01.423

PostgreSQL:

在当前日期 2012 年 11 月 21 日基础上添加 1 天

SELECT CURRENT_DATE + INTERVAL '1 day';
#2012-11-22 17:22:01
SELECT CURRENT_DATE + 1;
#2012-11-22 17:22:01

http://www.sqlines.com/postgresql/how-to/dateadd

编辑:

如果您使用动态时间长度来创建字符串,然后将其转换为间隔,例如:

,这可能会很有用

+ (col_days || ' days')::interval


1
投票

您可以使用

date + 1
执行与
dateadd()
相同的操作,但我不认为您的查询会执行您想要执行的操作。

您应该使用窗口函数:

with plays as (
  select distinct date, user_id
    from clickstream_videos
   where event_name = 'video_play' 
     and user_id is not null
), nextdaywatch as (
  select date, user_id, 
         case
           when lead(date) over (partition by user_id
                                     order by date) = date + 1 then 1
           else 0
         end as user_view_next_day
    from plays
)
select date, 
       count(*) as users_view_videos,
       sum(user_view_next_day) as users_view_next_day
  from nextdaywatch
 group by date
 order by date;   

0
投票

从 postgres 16 开始

DATE_ADD()
现已存在。

在您的示例中,您可以使用

DATE_ADD(currentday.date, '1 day')

来自文档:

date_add ( timestamp with time zone, interval [, text ] )
→ 带时区的时间戳

向带有时区的时间戳添加一个间隔,根据第三个参数指定的时区或当前的 TimeZone 设置(如果省略)计算一天中的时间和夏令时调整。带有两个参数的形式相当于带有时区的时间戳 + 间隔运算符。

date_add('2021-10-31 00:00:00+02'::timestamptz, '1 day'::interval, 'Europe/Warsaw')
→ 2021-10-31 23:00:00+00

© www.soinside.com 2019 - 2024. All rights reserved.