代码之家  ›  专栏  ›  技术社区  ›  Panama Jack

获取即将到来的生日Mysql和PHP

  •  1
  • Panama Jack  · 技术社区  · 14 年前

    我一直在尝试使用mysql语句和php来获得即将到来的生日。问题是我已经看到一些解决方案,但它们使用日期字段。不幸的是,我的被存储为时间戳。下面的代码只在出生日期在1970年之后时产生结果。我如何才能得到一个查询,将给我当前月,下个月,月后等即将到来的生日?我怎么才能让它也忽略这一年呢?

        $sql_query = "
            SELECT mem_id, DATE_FORMAT(FROM_UNIXTIME( birthdate ),'%d/%m/%Y') 
    )
            FROM profiles
            WHERE
                IF ( MONTH( NOW() ) < 12,
                  MONTH( DATE_FORMAT(FROM_UNIXTIME( birthdate ),'%Y%m%d') ) = MONTH( NOW() ) + 1,
                  MONTH( DATE_FORMAT(FROM_UNIXTIME( birthdate ),'%Y%m%d') ) = 1)
            ORDER BY birthdate";
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   Ludo - Off the record    12 年前

    我一直在搜索这段代码,但找不到干净/简单的查询(这也适用于闰年(2月29日问题))

    所以我自己做了。

    SELECT name, date_of_birty FROM users WHERE 
            DATE(CONCAT(YEAR(CURDATE()), RIGHT(date_of_birty, 6)))
                    BETWEEN 
                    DATE_SUB(CURDATE(), INTERVAL 1 DAY)
                    AND
                    DATE_ADD(CURDATE(), INTERVAL 5 DAY)
    
        2
  •  0
  •   deceze    14 年前
    $currentMonth = date('n'); // or date('n', strtotime('+1 month')) or whatever
    $query = "SELECT ... WHERE MONTH(FROM_UNIXTIME(`birthday`)) = $currentMonth";
    

    请注意,虽然UNIX时间戳是存储生日的糟糕选择:

    • 它们不能存储1970年以前的日期(除非您使用负数,这可能不适用于所有地方)。
    • 要在数据库中查询它们,必须转换 FROM_UNIXTIME 比较一下,这很贵。

    DATE columns 存储日期,这允许您存储范围更广的日期,并且查询效率更高。