因为每个数据库都自带不同的函数,所以使用的方法也有不同
- Mysql的时间计算函数
select time,year(time),month(time), DAY(time),TIME(time) from user #分别取年、月、日、时间
- PostgreSQL 计算时间的函数
模式 描述
HH 一天的小时数(01-12)
HH12 一天的小时数(01-12)
HH24 一天的小时数(00-23)
MI 分钟(00-59)
SS 秒(00-59)
MS 毫秒(000-999)
US 微秒(000000-999999)
AM 正午标识(大写)
Y,YYY 带逗号的年(4和更多位)
YYYY 年(4和更多位)
YYY 年的后三位
YY 年的后两位
Y 年的最后一位
MONTH 全长大写月份名(空白填充为9字符)
Month 全长混合大小写月份名(空白填充为9字符)
month 全长小写月份名(空白填充为9字符)
MON 大写缩写月份名(3字符)
Mon 缩写混合大小写月份名(3字符)
mon 小写缩写月份名(3字符)
MM 月份号(01-12)
DAY 全长大写日期名(空白填充为9字符)
Day 全长混合大小写日期名(空白填充为9字符)
day 全长小写日期名(空白填充为9字符)
DY 缩写大写日期名(3字符)
Dy 缩写混合大小写日期名(3字符)
dy 缩写小写日期名(3字符)
DDD 一年里的日子(001-366)
DD 一个月里的日子(01-31)
D 一周里的日子(1-7;周日是1)
W 一个月里的周数(1-5)(第一周从该月第一天开始)
WW 一年里的周数(1-53)(第一周从该年的第一天开始)
具体的可以google时间的函数
如:
SELECT "users".* FROM "users" WHERE (to_char(created_at,'MM') = '04' ) ORDER BY "users"."id"
假设有这样的一个场景: 我们需要统计四月份注册的用户数量
- 在mysql中的
User.where("MONTH(created_at) = ?",4).last.id
- 在PostgreSQL中可以使用
User.where("to_char(created_at,'MM') = ? ","04").last.id
这个是利用了数据库系统自带的函数去进行筛选
不使用数据系统自带函数进行筛选
在postgresql中(一般通用)
time = "2017-04-01".to_time
start_date = time.beginning_of_month
end_date = time.end_of_month
User.where(created_at: start_date..end_date).last.id
推荐不使用系统自带的函数进行筛选
为啥?(postgresql数据库)
#方法1
> User.where("to_char(created_at,'MM') = ? ","04").last.id
User Load (90.4ms) SELECT "users".* FROM "users" WHERE (to_char(created_at,'MM') = '04' ) ORDER BY "users"."id" DESC LIMIT 1
=> 102
#方法2
> User.where(created_at: start_date..end_date).last.id
User Load (64.9ms) SELECT "users".* FROM "users" WHERE ("users"."created_at" BETWEEN '2017-03-31 16:00:00.000000' AND '2017-04-30 15:59:59.999999') ORDER BY "users"."id" DESC LIMIT 1
=> 102
首先方法2通用,便于以后代码的维护
最重要明显看到 方法2比方法1快30ms
网友评论