【问题标题】:SQL get nearest date recordSQL获取最近的日期记录
【发布时间】:2017-08-18 05:22:48
【问题描述】:

这是一个示例数据:

 Booking_id   Name   start_date
   1            abc   1/1/2018
   2            efg   5/2/2018
   3            pqr   16/1/2018
   4            xyz   19/2/2018

我希望这是为了最接近今天的日期在顶部和过去的日期在最后

【问题讨论】:

标签: php sql yii


【解决方案1】:

您需要 SORT descstart_Date 上的函数。以下是将产生您想要的结果的查询。

select * from table1
order by Start_Date desc;

您可以查看 sqlfiddle 演示 here

如果日期是将来,您必须使用asc 来获得您想要的结果。

select * from table1
order by Start_Date asc;

如果您的日期是过去和未来日期的混合,如以下示例数据。

ID Name   Start_Date
---------------------
1  abc   2018-01-01
2  efg   2018-02-05
3  pqr   2018-01-16
4  xyz   2018-02-19
1  abc   2017-01-01
2  efg   2017-02-05
3  pqr   2017-01-16
4  xyz   2017-02-19

下面的查询可以选择以更友好的格式显示数据。

select * from (
select * from table1
where start_date < current_date
order by start_date desc
) as B
union
select 0,'TODAY_DATE', current_date
union
select * from (
select * from table1
where start_date > current_date
order by start_date asc
) as A 

它将以desc顺序对过去日期数据进行排序,然后将TODAY日期添加到结果中,然后以asc格式添加未来数据,如下所示。

 ID  Name        Start_Date
--------------------------
4   xyz         2017-02-19
2   efg         2017-02-05
3   pqr         2017-01-16
1   abc         2017-01-01
0   TODAY_DATE  2017-08-18
1   abc         2018-01-01
3   pqr         2018-01-16
2   efg         2018-02-05
4   xyz         2018-02-19

查看 SQLfiddle 演示 here

【讨论】:

  • 这条返回记录倒序而不是最近的日期
【解决方案2】:

您可以使用以下查询:

SELECT Booking_id, Name, start_date
FROM mytable
ORDER BY ABS(DATEDIFF(start_date, NOW()));

ORDER BY 子句按距今天日期的天数排序。距离最短的日期在前。

Demo here

【讨论】:

    【解决方案3】:

    使用sql的ORDER BY函数。像这样:

    SELECT * 
    FROM 
         table_name 
    ORDER BY 
       start_date DESC;
    

    【讨论】:

      【解决方案4】:

      根据我的理解,下面将是您的查询,请让我进一步了解。

      使用可以根据需求使用Order by with ASC|Desc,

      select * from booking_table order by start_date DESC;
      

      【讨论】:

      • 这个按日期倒序返回的记录不是最接近今天日期的记录
      • 亲爱的 Paritosh,从今天起倒序意味着它将按降序呈现最近的记录到今天的日期。
      【解决方案5】:

      您想要距今天最近的日期,因此您可以尝试以下查询

      SELECT * FROM table 
      WHERE start_date >= now()
      ORDER BY start_date ASC;
      

      如果你想要它在尊敬的顺序,那么:

      SELECT * FROM table 
      WHERE start_date <= now()
      ORDER BY start_date DESC;
      

      【讨论】:

      • 感谢您的回复,它解决了我的一半问题,现在我正在从今天的日期获取记录,但我希望将旧记录附加到最后我该怎么做?
      • 是的,我已经无限制地尝试了它,它返回今天和未来的记录,但不返回 start_date
      • 您想要所有记录?今天、未来和过去?
      • 是的,顺序是这样的——今天的记录之后是未来的记录,最后是旧的记录
      【解决方案6】:

      这对你有用,

      select * from table_name Order By start_date Desc;

      【讨论】:

        【解决方案7】:

        基于您的一个 cmets:

        今天的记录之后是未来的记录,然后是旧的记录 结束

        这将首先排序今天和未来的日期,然后是过去的日期:

        ORDER BY 
           CASE WHEN start_date >= CURRENT_DATE THEN 1 ELSE 2 END,
           start_date
        

        如果您希望旧日期按降序排序,则新旧日期均按升序排序:

        ORDER BY 
           CASE WHEN start_date >= CURRENT_DATE THEN 1 ELSE 2 END,
           ABS(CURRENT_DATE - start_date)
        

        【讨论】:

          猜你喜欢
          • 2017-10-02
          • 2014-03-10
          • 1970-01-01
          • 2019-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多