V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
vinsony
V2EX  ›  MySQL

取最近 10 天内要过生日的用户, sql 该怎么写?

  •  
  •   vinsony · 2015-06-09 21:51:31 +08:00 · 5478 次点击
    这是一个创建于 3454 天前的主题,其中的信息可能已经有所发展或是发生改变。
    已经有个DATE类型的生日字段了
    现在主要是跨年的时候,不能单纯只比较日期。
    有大神在吗?
    第 1 条附言  ·  2015-06-09 22:34:04 +08:00
    实际上是这样,比如今天是2015-12-25,那么用户生日字段就是下面这种,分成了N个时间段
    2015-12-25至2016-01-03
    2014-12-25至2015-01-03
    2013-12-25至2014-01-03
    2012-12-25至2013-01-03
    ......

    sql不太擅长,大概就是这个意思。
    20 条回复    2015-06-10 14:18:08 +08:00
    zwzmzd
        1
    zwzmzd  
       2015-06-09 21:55:04 +08:00
    gamexg
        2
    gamexg  
       2015-06-09 22:02:23 +08:00 via Android
    Date索引用不上吧?
    变成全表扫描了
    xuyl
        3
    xuyl  
       2015-06-09 22:08:05 +08:00
    跨年也好办啊,转化为unix时间戳再比较呗。
    vinsony
        4
    vinsony  
    OP
       2015-06-09 22:08:37 +08:00
    @zwzmzd 这个只能获取2个日期之间的吧,生日可是忽略年份只比较月日的哦。
    wd0g
        5
    wd0g  
       2015-06-09 22:17:16 +08:00
    @vinsony 在建一个字段?
    hiboshi
        6
    hiboshi  
       2015-06-09 22:25:43 +08:00
    format db 的 生日字段
    BETWEEN 或者 大于当前时间 并且 小于 当前时间+30天
    Paranoid
        7
    Paranoid  
       2015-06-09 22:28:18 +08:00
    为啥用sql写?

    用程序计算出 过生日的日期,再查询。
    vinsony
        8
    vinsony  
    OP
       2015-06-09 22:31:14 +08:00
    实际上是这样,比如今天是2015-12-25,那么要取的用户生日就是
    2015-12-25至2016-01-03
    2014-12-25至2015-01-03
    2013-12-25至2014-01-03
    ......
    vinsony
        9
    vinsony  
    OP
       2015-06-09 22:35:36 +08:00
    @Paranoid 像你说的,这个怎么查呢?
    marvinwilliam
        10
    marvinwilliam  
       2015-06-09 22:40:06 +08:00
    在条件里面使用to_date函数转换成月日的时间然后再和指定的月日比较?怎么感觉这个好不效率的说。。。
    Paranoid
        11
    Paranoid  
       2015-06-09 22:51:24 +08:00
    @vinsony 我会冗余出一个字段 :P
    frankyzf
        12
    frankyzf  
       2015-06-09 22:57:34 +08:00
    生成10天的月日列表如1215 1216 1217... 0103,用生日的月日in列表可以吗?
    frittle
        13
    frittle  
       2015-06-09 23:00:14 +08:00
    levon
        14
    levon  
       2015-06-09 23:56:01 +08:00
    把生日的年改成今年,比如出生日期是“1990-10-10”,那生日就是“2015-10-10",算2015-10-10是不是最近10天就可以了。
    levon
        15
    levon  
       2015-06-09 23:59:10 +08:00
    补充一下,如果算出的今年生日是今年过掉的日子,那下一个生日的年就应该今年+1
    zoowii
        16
    zoowii  
       2015-06-10 00:06:30 +08:00
    增加一个字段记录月日好了,这样直接=比较了
    free9fw
        17
    free9fw  
       2015-06-10 09:46:10 +08:00
    写个方法嘛
    iyangyuan
        18
    iyangyuan  
       2015-06-10 11:20:23 +08:00 via iPhone
    只能加冗余字段了,加一个月日字段。
    否则不走索引,效率太低。
    phx13ye
        19
    phx13ye  
       2015-06-10 13:39:51 +08:00
    DAYOFYEAR() betweein
    jjplay
        20
    jjplay  
       2015-06-10 14:18:08 +08:00
    http://segmentfault.com/q/1010000002869960
    Carbon 可能是 PHP 中时间处理最好的轮子了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1187 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:15 · PVG 02:15 · LAX 10:15 · JFK 13:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.