美文网首页RubyRuby on RailsRuby、Rails知识
利用数据库自带的函数进行数据筛选

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

作者: 得失的瘦马 | 来源:发表于2017-10-09 18:28 被阅读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

    相关文章

      网友评论

        本文标题:利用数据库自带的函数进行数据筛选

        本文链接:https://www.haomeiwen.com/subject/hovpyxtx.html