mysql - Doctrine2 选择生日范围

标签 mysql sql

我想选择所有在即将到来的 5 天过生日的员工。生日保存在日期字段中。感觉我必须使用介于两者之间,但年份范围会破坏结果。

基本上我只想按月和日选择一个日期,范围是 5 天。

数据库方案:

CREATE TABLE IF NOT EXISTS `tbl_office_employee` (
  `id` int(11) NOT NULL auto_increment,
  `firstname` varchar(256) collate utf8_unicode_ci default NULL,
  `surname` varchar(256) collate utf8_unicode_ci default NULL,
  `birthdate` date NOT NULL,
  `telephone` varchar(256) collate utf8_unicode_ci default NULL,
  PRIMARY KEY  (`id`)
)

有人知道一个查询来完成这个吗?

最佳答案

您想在 MySQL 中使用类似的东西(已编辑 - 真正可行的示例):

SELECT *
FROM `tbl_office_employee` e 
WHERE FLOOR(
        (
            UNIX_TIMESTAMP(
                CONCAT(
                    YEAR(CURDATE()) + (DATE_FORMAT(e.birthdate, '%m-%d') < DATE_FORMAT(CURDATE(), '%m-%d')),
                    DATE_FORMAT(e.birthdate, '-%m-%d'))) 
            - UNIX_TIMESTAMP(CURDATE()))
        / 86400) < 5

下面编写的 SQL 查询不会选择明年的生日(即 1 月 1 日至 5 日,当它是 12 月 31 日时),所以使用上面的一个...

选择 * FROM tbl_office_employee e WHERE UNIX_TIMESTAMP(DATE_FORMAT(e.birthdate, CONCAT(YEAR(CURDATE()), '-%m-%d'))) BETWEEN UNIX_TIMESTAMP(CURDATE() ) AND UNIX_TIMESTAMP(DATE_ADD(CURDATE(), INTERVAL 5 DAY))

我不得不使用 UNIX_TIMESTAMP,因为日期发生了变化,即从 5 月 31 日到 6 月 5 日(5 不大于 31)并且在 e 中更改了年份.birthdate.


可以在 DQL(Doctrine 1)中完成:

Doctrine_Query::create()
    ->select('e.firtsname')
    ->from('tbl_office_employee e')
    ->where('e.date BETWEEN ? AND ?', array($today_date, $date_plus_5_days))
    ->getSqlQuery();

应该输出基本相同。

我不认为 DATE_ADD 在开箱即用的 DQL 中可用,但是 there is chapter called DQL User Defined Functions in docs, which has example implementation of DATE_ADD function for MySQL .

关于mysql - Doctrine2 选择生日范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6187675/

相关文章:

sql - 连接操作 Access 中的语法错误

sql - 数据透视问题,SQL Server

java - 如何从没有主键的连接表中创建实体

Java char[] array jPasswordField处理和SQL更新语句

php - 使用 DataTable 获取记录需要更多时间

mysql - 无法通过本地网络连接到WAMP服务器

sql - 我如何优化这个慢查询?

mysql - 百万条记录的表实时聚合

java - 设置日期后无法保存实体

java - SQLXML 的抽象方法错误