我有一个redshift示例表。我想生成一份包含月份数据的报告。到目前为止,我发现了以下三种方式。
1. trunc(created_at_date) between '2014-06-01' and '2014-06-30';
2. created_at_date like '2014-06%'
3. created_at_date >= '2014-06-01 00:00:00' and created_at_date <= '2014-06-30 23:59:59'
这样做的最佳和最佳方式是什么?
答案 0 :(得分:1)
不是第一个,因为它执行不必要的(除非您确实有未处理的数据)截断。
1. trunc(created_at_date) between '2014-06-01' and '2014-06-30';
绝对不是出于明显的原因(例如)
2. created_at_date like '2014-06%'
可能是这个:
3. created_at_date >= '2014-06-01 00:00:00' and created_at_date <= '2014-06-30 23:59:59'
但是,由于要求是生成月度报告(我认为这是一项经常性的任务,并且涉及多个数据源),因此建议创建一个一次性的 calendar 表。
该表将日期映射到月值,然后您可以将源数据与该表连接起来并按“月”列分组。
P.S。刚意识到我回答了一个非常“古老”的问题:p
答案 1 :(得分:0)
怎么样
“
在to_date('20140601','YYYYMMDD')和to_date('20140630','YYYYMMDD')之间created_at_date
“
答案 2 :(得分:0)
我建议至少不要使用第二个(有喜欢的)...... 为了便于阅读,主要是因为它自然地读取(至少对我来说),我通常使用像
这样的东西select col1, col2 ,
datepart(d, created_at_date) , datepart(mm, created_at_date)
from ...
group by datepart(d, created_at_date) , datepart(mm, created_at_date)
如果您想按特定月份或年份过滤,请在where datepart(mm,created_at_date)= 6
中过滤查看http://docs.aws.amazon.com/redshift/latest/dg/r_Dateparts_for_datetime_functions.html
答案 3 :(得分:0)
http://docs.aws.amazon.com/redshift/latest/dg/r_DATE_CMP.html
选择caldate,&#39; 2008-01-04&#39;, date_cmp(caldate,&#39; 2008-01-04&#39;) 从日期
答案 4 :(得分:0)
我更喜欢第四种方式:
date_trunc('month', created_at_date) = '2014-06-01'