RubyRuby on RailsRuby、Rails知识

利用数据库自带的函数进行数据筛选

2017-10-09  本文已影响28人  得失的瘦马

因为每个数据库都自带不同的函数,所以使用的方法也有不同

  1. Mysql的时间计算函数
select time,year(time),month(time), DAY(time),TIME(time) from user  #分别取年、月、日、时间
  1. 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"

假设有这样的一个场景: 我们需要统计四月份注册的用户数量

  1. 在mysql中的
User.where("MONTH(created_at) = ?",4).last.id
  1. 在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

上一篇下一篇

猜你喜欢

热点阅读