SQL:来自具有不同日期格式的不同表的聚合

Posted

技术标签:

【中文标题】SQL:来自具有不同日期格式的不同表的聚合【英文标题】:SQL: aggregation from different tables with different date formats 【发布时间】:2018-02-22 13:15:33 【问题描述】:

使用以下 sql 表:

表:财政

DateID   | date                  | fiscal_year | fiscal_week 
20170101   2017-01-01 00:00:00.0   2017          2017 WK 01
20170102   2017-01-02 00:00:00.0   2017          2017 WK 01

表:email_info

email_id | email_name    | email_subjectline
123        New_Year_2017   Welcome the new year!
345        Reminder        Don't forget 

表:send_info

email_id | sent_date
123      | 1/1/2017 8:58:39 PM
345      | 1/2/2017 6:33:39 AM

表格:click_info

recipient | email_id | click_date
XYZ         123         1/7/2017 4:25:27 PM
ABC         123         1/5/2017 3:13:56 AM
CDF         345         1/6/2017 2:20:16 AM
ABC         345         1/14/2017 3:33:25 AM

显然每个表中有很多行。

电子邮件表之间的连接很简单。

SELECT * 
FROM email_info
JOIN sent_info
ON sent_info.email_id = email_info.email_id
JOIN click_info
ON click_info.email_id = email_info.email_id

我正在努力解决以下问题:

如何将所有日期转换为相同的格式? (我不需要时间, 只有一天) 如何加入会计表,以便我可以按会计周过滤,例如 如何计算电子邮件在发送日期后 7 天内的所有点击次数(不能按日期硬编码,但必须是动态的)

这是我正在寻找的输出(按财政周过滤 = 2017 WK 01):

email_id | email_name    | sent_date |  fiscal_week | Clicks
123        New_year_2017   1/1/2017     2017 WK 01     2
345        Reminder        1/2/2017     2017 WK 01     1

*请注意,click_info 表示例中的最后一次点击未计算在内,因为它已超过发送日期后的 7 天。

** DateID 是整数,send_date 和 click_date 是字符串/varchar

【问题讨论】:

dateId、send_date、send_date 列是哪一种数据类型? dateid 是整数,send_date 和 click_date 是字符串/varchar 字符串 varchar 带有日期和时间 .. 和整数,其数字等于日期 ..? ???很抱歉,但这不是设计数据库的合理方式.. 【参考方案1】:

假设 dateId 是 varchar 而其他是 datetime 应该是

select a.email_id, a.email_name, date(b.sent_date), c.fiscal_week, count(d.click_date)
from email_info a 
inner join fiscal c on  str_to_date(c.dateID, '%Y%m%d') = date(b.sent_date)
inner join  sent_info b on b.email_id = c.email_id
inner join click_info d on d.email_id = b.email_id 
    and date(d.click_date) between date(b.sent_date) and DATEADD(week,1,date(b.sent_date))
group by  a.email_id, a.email_name, date(b.sent_date), c.fiscal_week

PS 如果您有其他格式可以正确转换并更改单件,请执行查询结构定义的事实

【讨论】:

很遗憾,其他日期不是日期时间,它们是字符串/varchar 那么您可以使用 str_to_date 简单地将字符串转换为日期时间,对于整数,您可以简单地转换为字符串...应该不难..查询的结构已经构建,所以您只能单件.. 我对演员很陌生,你介意告诉我,你会怎么做吗?非常感谢您的帮助 将 int 转换为字符串 ***.com/questions/15368753/cast-int-to-varchar 和 str_to_date ***.com/questions/15396058/… 如何将所有日期转换为相同的格式? (我不需要时间,只需要日期)DATE(0)

以上是关于SQL:来自具有不同日期格式的不同表的聚合的主要内容,如果未能解决你的问题,请参考以下文章

如何将日期字符串转换为具有不同日期格式的时间戳?

sql 从字符串..with毫秒的Oracle日期时间戳格式化。该示例还使用listagg在oracle中具有行的聚合

使用 nzload 上传具有两种不同日期格式的文件

我想比较具有不同日期格式的两列

为啥 APEX 和 Oracle SQL Developer 中的日期格式不同?

在同一页面上使用两个具有两种不同日期格式的日期选择器