Mysql 按一年中的日期排序,从今天开始循环到昨天

Mysql 按一年中的日期排序,从今天开始循环到昨天,mysql,Mysql,我有一个数据库表dates,其中列的格式如下: ------------------------- | id | name | day | month | ------------------------- | 1 | matt | 7 | 3 | | 2 | john | 2 | 1 | | 3 | lily | 24 | 11 | ------------------------- 按月份和日期排序提取数据很容易,但如何从今天开始提取所有数据 标

我有一个数据库表dates,其中列的格式如下:

 -------------------------
| id | name | day | month |
 -------------------------
|  1 | matt |   7 |     3 |
|  2 | john |   2 |     1 |
|  3 | lily |  24 |    11 |
 -------------------------
按月份和日期排序提取数据很容易,但如何从今天开始提取所有数据

标准SQL:按月ASC、日ASC从日期顺序选择*

我想我需要以某种方式使用CURDATE

例如,今天是4月17日,所以我希望返回如下数据:

 -------------------------
|  3 | lily |  24 |    11 |
|  2 | john |   2 |     1 |
|  1 | matt |   7 |     3 |
 -------------------------

因为11月24日是从今天开始的下一个日期,然后是1月2日,然后是3月7日。

此查询将帮助您解决问题

(
    SELECT DATE_FORMAT(CURDATE(), '%d') cur_day, DATE_FORMAT(CURDATE(), '%m') cur_month,`day`, `month`, 'current_year' title
    FROM your_table
    GROUP BY id
    HAVING cur_day  >= DAY AND cur_month >= month
    ORDER BY `month` ASC, `day` ASC
)
UNION 
(
    SELECT DATE_FORMAT(CURDATE(), '%d') cur_day, DATE_FORMAT(CURDATE(), '%m') cur_month,`day`, `month`, , 'next_year' title 
    FROM your_table
    GROUP BY id
    HAVING cur_day < day and cur_month < month
    ORDER BY `month` ASC, `day` ASC
)
首先,我将获得当前年份的所有行,即即将到来的日期。
其次,我将获得所有已通过并将于明年进入的行。

此查询将帮助您解决问题

(
    SELECT DATE_FORMAT(CURDATE(), '%d') cur_day, DATE_FORMAT(CURDATE(), '%m') cur_month,`day`, `month`, 'current_year' title
    FROM your_table
    GROUP BY id
    HAVING cur_day  >= DAY AND cur_month >= month
    ORDER BY `month` ASC, `day` ASC
)
UNION 
(
    SELECT DATE_FORMAT(CURDATE(), '%d') cur_day, DATE_FORMAT(CURDATE(), '%m') cur_month,`day`, `month`, , 'next_year' title 
    FROM your_table
    GROUP BY id
    HAVING cur_day < day and cur_month < month
    ORDER BY `month` ASC, `day` ASC
)
首先,我将获得当前年份的所有行,即即将到来的日期。 第二,我得到了所有已经通过并将于明年进入的行。

试试这个

SELECT * FROM dates where day >= DAY(CURDATE()) ORDER BY month ASC, day ASC
试试这个

SELECT * FROM dates where day >= DAY(CURDATE()) ORDER BY month ASC, day ASC
试试这个

它是两个子查询的并集

SELECT 
  rslt.id,
  rslt.name,
  rslt.day,
  rslt.month 
FROM
  (
    (SELECT 
      a.*,
      DATE_FORMAT(CURDATE(), '%m-%d') AS cdate,
      CONCAT(
        LPAD(`month`, 2, 0),
        '-',
        LPAD(`day`, 2, 0)
      ) AS bday,
      1 AS rank 
    FROM
      `dates` AS a 
    HAVING cdate <= bday 
    ORDER BY bday ASC) 
    UNION
    (SELECT 
      b.*,
      DATE_FORMAT(CURDATE(), '%m-%d') AS cdate,
      CONCAT(
        LPAD(`month`, 2, 0),
        '-',
        LPAD(`day`, 2, 0)
      ) AS bday,
      2 AS rank 
    FROM
      `dates` AS b 
    HAVING cdate > bday 
    ORDER BY bday ASC)
  ) AS rslt 
ORDER BY rank ASC,
  bday ASC ;
试试这个

它是两个子查询的并集

SELECT 
  rslt.id,
  rslt.name,
  rslt.day,
  rslt.month 
FROM
  (
    (SELECT 
      a.*,
      DATE_FORMAT(CURDATE(), '%m-%d') AS cdate,
      CONCAT(
        LPAD(`month`, 2, 0),
        '-',
        LPAD(`day`, 2, 0)
      ) AS bday,
      1 AS rank 
    FROM
      `dates` AS a 
    HAVING cdate <= bday 
    ORDER BY bday ASC) 
    UNION
    (SELECT 
      b.*,
      DATE_FORMAT(CURDATE(), '%m-%d') AS cdate,
      CONCAT(
        LPAD(`month`, 2, 0),
        '-',
        LPAD(`day`, 2, 0)
      ) AS bday,
      2 AS rank 
    FROM
      `dates` AS b 
    HAVING cdate > bday 
    ORDER BY bday ASC)
  ) AS rslt 
ORDER BY rank ASC,
  bday ASC ;

看起来有人太懒了,不记得朋友的生日,想知道下一个朋友的生日:就是这样。老实说,我正在学习Linux cron作业,我认为每周发一封电子邮件让我知道即将到来的重要日期是最好的做法,但我也希望有一个用户界面来查看/编辑这些日期。懒惰是编写程序和设计数据库的合理理由。你有完整的日期栏吗?我没有,没有,因为年份没有存储。在完整的日期字段中存储为0000-03-07会更好吗?看起来有人太懒了,不记得朋友的生日,想知道下一个朋友的生日:正是这样。老实说,我正在学习Linux cron作业,我认为每周发一封电子邮件让我知道即将到来的重要日期是最好的做法,但我也希望有一个用户界面来查看/编辑这些日期。懒惰是编写程序和设计数据库的合理理由。你有完整的日期栏吗?我没有,没有,因为年份没有存储。在完整日期字段中存储为0000-03-07是否更好?