一、本月第一天
在报表抽取时,常常需要获取本月第一天。然后作为报表抽取的查询条件。第一天常常有两种格式,一种是日期,另外一种是时间戳。
-- 本月。如2019-02
SELECT to_char(now(),'YYYY-MM')
-- 本月第一天,日期格式 。 例如 2019-02-01
SELECT to_char(now(),'YYYY-MM-01')
-- 本月第一天。时间戳格式。 例如 2019-02-01 00:00:00
SELECT to_char(now(),'YYYY-MM-01 00:00:00')
还可以使用 date_trunc()
函数
-- 本月第一天: 2019-02-01 00:00:00+08
select date_trunc('month',now())
-- 本月第一天12点 : 2019-02-01 12:00:00+08
select date_trunc('month',now()) +interval '12 h';
二、 下月第一天或者上月第一天
报表抽取时,抽取上月数据的情况也是很常见。时间小于下月第一天,可以做为这个月结束。或者两个时间点/日期 有必要。
-- 时间戳下个月开始 2019-03-01 00:00:00+08
SELECT to_timestamp((to_char(( now() + interval '1 month'),'YYYY-MM-01')),'YYYY-MM-DD 00:00:00')
-- 时间戳:上个月开始 2019-01-01 00:00:00+08
SELECT to_timestamp((to_char(( now() + interval '-1 month'),'YYYY-MM-01')),'YYYY-MM-DD 00:00:00')
-- 日期:下个月第一天 2019-03-01
SELECT to_date((to_char(( now() + interval '1 month'),'YYYY-MM-01')),'YYYY-MM-DD')
-- 日期:上个月第一天 2019-01-01
SELECT to_date((to_char(( now() + interval '-1 month'),'YYYY-MM-01')),'YYYY-MM-DD')
三、上一季度、本季度、下一季度
-- 上一季度第一天:2018-10-01 00:00:00+08
select date_trunc('quarter',now() + interval '-3 month')
-- 本季度第一天: 2019-01-01 00:00:00+08
select date_trunc('quarter',now())
-- 下一季度第一天:2019-04-01 00:00:00+08
select date_trunc('quarter',now() + interval '3 month')
四、 日期序列。
生成2019-01-01 ~2019-01-31 的日期序列
-- 生成时间戳的格式
SELECT * FROM generate_series('2019-01-01'::DATE,'2019-01-31'::DATE,'1 DAY');
-- 生成日期的格式
SELECT date(d) FROM generate_series('2019-01-01'::DATE,'2019-01-31'::DATE,'1 DAY') AS _date(d);
generate_series(start,stop,step) – 开始、结束、步长。
五、 提取日期字段的年、月、日
-- 提取日期字段的年、月、日
-- 年 2019
SELECT EXTRACT(YEAR FROM now())
-- 月 2
SELECT EXTRACT(MONTH FROM now())
-- 日 26
SELECT EXTRACT(DAY FROM now())
六、 今天是星期几
-- 今天星期:2
select CASE WHEN extract(DOW FROM now()) = 0 THEN 7 else extract(DOW FROM now()) END AS "星期"
-- 扩展,如果周一到周六为工作日,周日为休息日。
select CASE WHEN EXTRACT (DOW FROM now()) = 0 THEN '0' ELSE '1' END AS isworkdate
七、获取本年的数据
# 获取今年
select to_char((SELECT now() as timestamp),'yyyy');
select date_trunc( 'year', now() );
# 获取去年
select to_char((select now() - interval '1 years'),'yyyy')
八、获取当前系统时间
select now();
select current_timestamp;
结果:2020-11-04 16:09:53.247825+08
# now()/current_timestamp展示当前系统的时间,日期格式
九、获取当前日期或时间
select current_date;
结果:2020-11-04
select current_time;
结果:16:14:08.501182+08
十、查询昨天的数据
select
DISTINCT count(id)
from
tablexx
where coalesce(l.join_date,l.sys_createdate) >= current_date - 1;
# 这里的coalesce函数,语法:coalesce(expr1,expr2,expr3...)
# 如果第一个字段存在就用第一个进行表达式判断;
# 如果第一个不存在为null则用第二个进行表达式判断;
# 如果都没有null则返回null
十一、查询本周的数据
# 查询某个时间的周一
SELECT ( DATE '2020-10-23' - INTERVAL '1 day' - ( EXTRACT ( dow FROM ( DATE'2020-10-23' - INTERVAL '1 day' ) ) - 1 || ' day' ) :: INTERVAL ) :: DATE;
# 减1 是因为得到的是以周一是星期的开始
# 查询本周的数据
SELECT( DATE ( now() ) - ( EXTRACT ( dow FROM DATE ( now() ) ) - 1 || ' day' ) :: INTERVAL ) :: DATE startasy,
( DATE ( now() ) - ( EXTRACT ( dow FROM DATE ( now() ) ) - 1 || ' day' ) :: INTERVAL ) :: DATE + 6 endday
from table d LIMIT 5;
# 本周周末
SELECT to_char(CURRENT_DATE +cast(-1*(TO_NUMBER(to_char(CURRENT_DATE,'D'),'99')-2)+6 ||' days' as interval),'yyyy-mm-dd');
#本周第一天
select date_trunc('week',now());
十二、近十二个月数据
WHERE request_date > (current_date - INTERVAL '12 months');
select date_trunc('month',current_date - INTERVAL '12 months')
十三、去年同期
select date_trunc('day',now() - INTERVAL '1 years')
参考
关于date_trunc() 函数,参考这篇文章PostgreSQL date_trunc() 截断日期函数,完成定时时间语法.
日期函数 PostgreSQL: Documentation: 9.2: Date/Time Functions and Operators