时间点和时间段

时间点函数

  • now() 是精确到年月日 时分秒, 2019-06-01 01:19:11
  • curdate() 是精确到年月日, 2019-06-01
  • last_day(now()) 能够求出本月的最后一天, 2019-06-30
  • date_format 时间格式化, date_format(now(), '%Y-%m-%d %H:%i%S')

    时间点

    今天
    1. select curdate();
    昨天
select date_sub(curdate(), interval 1 day);

找到数据库中昨天的调用记录:

select * from company_trade_journal
where date_format(create_at, '%Y-%m-%d') = date_sub(curdate(), INTERVAL 1 day)
and company_uuid='xxxxx';

本月 1 日

select date_format(now(), '%Y-%m-01');

本月月份

select date_format(now(), '%m');

本月最后一天

select last_day(now());

上个月的今天

select date_sub(curdate(), interval 30 day);

前 n 年/月/日

select curdate();
select date_sub(curdate(), interval n day/week/month/year);

n 年/月/日 后

date_add(curdate(), INTERVAL 7 DAY)

时间段

近 n 天, 包括今天
时间大于前 n 天即可

time > date_sub(curdate(), interval n day/week/month/year);

时间比较

时间可以使用字符串来比较的。
以天为单位进行比较时,精确到时分秒的时间需要先截取。

select * from company_trade_journal 
where service='model_service' and 
date(create_at) >= '2019-05-24' 
and company_uuid='xxxxx';

在比较时间时,一定要保证他们都是同一个单位的。
比如 2019-05-242019-05-24 12:04:03 这就是两个维度的时间。
犯下的错误,就是 create_at 这个时间精确到秒, between … and … 两个维度的时间精确到天。结果就犯错了。

create or replace view  product_called_times_monthly_summary  as select
date_format(date_sub(curdate(), INTERVAL 30 DAY), '%Y-%m-01 %H:%i:%s') AS 'start_time'
    , date_format(last_day(date_sub(curdate(), INTERVAL 30 DAY)), '%Y-%m-%d 24:00:00') AS 'end_time',
c.name as 'company_name',
round(c.balance/100, 2) as 'company_balance',
round(sum(t.cost)/100, 2) as 'company_cost'
from company_trade_journal as t
join company as c
on t.company_uuid = c.uuid
where
date_format(t.create_at, '%Y-%m-%d') BETWEEN date_format(date_sub(curdate(), INTERVAL 30 DAY), '%Y-%m-01') AND last_day(date_sub(curdate(), INTERVAL 30 DAY))
group by t.company_uuid;

时间函数

截取日期

select date(now());
> 2019-05-28

时间与其他数据类型相互转化

与字符串相互转化

  1. 时间转化为字符串, date_format

    date_format(now(),"%Y-%m-%d %H")
    
  2. 字符串转化为时间, str_to_date

    str_to_date('2018-02-05 12:07:09', "%Y-%m-%d %H")
    

    datetime 与 时间戳互相转化

  3. 转化为时间戳

    unix_timestamp(now())
    
  4. 时间戳转化为 datetime

    from_unixtime(unix_timestamp(now()))
    

pg

时间->字符串

SELECT *, to_char( last_update, 'DD-MON-YYYY') as re_format from actor;