MySql - 按日期排序,然后按时间排序

17

我有一个包含两个“datetime”字段的表格:'eventDate'和'eventHour'。 我尝试按'eventDate'排序,然后按'eventHour'排序。

对于每个日期,我都会有一系列事件,这就是为什么我需要按日期和时间排序的原因。

谢谢!!

9个回答

31

我不确定你的问题中是否有任何隐含的意义,但标准的做法似乎很适合:

... order by eventDate, eventHour

这可以让你在日期范围内获得小时,例如:

Feb 15
    09:00
    12:00
    17:00
Feb 23
    22:00
    : :

如果你实际上将这两个字段都设为真实的datetime字段,那么你的模式有问题。你应该有一个日期字段和一个时间或整数字段来表示小时。

你可以将它们合并为单个datetime字段,但在要分开使用它们时,你应该权衡这种做法所带来的每行函数在select语句中的低效率。通常来说,如果你要分别使用它们,最好还是保持字段分离。

如果你确实需要使用每行函数,你可以使用:

date(datetime_column)
time(datetime_column)

提取 datetime 中的日期和时间组件。


听起来他们只想要事件日期的日期和事件小时。如果事件日期的小时在该日期的所有结果中不同,则会在事件小时之前排序。 - Matt Mitchell

14
如果您想按最新的事件日期首先列出数据,如果存在相同日期的记录,则数据将按时间排序,即最新时间排在前面。
您可以尝试以下操作:
select * from my_table order by eventDate DESC, eventHour DESC

4
为什么不将eventDateeventHour保存到同一个字段中,如果它们都是DateTime类型的?为了在当前方案中实现你想要的结果,你可以这样做:
SELECT * FROM table 
  ORDER BY 
    EXTRACT(YEAR_MONTH FROM eventDate),
    EXTRACT(DAY FROM eventDate),
    EXTRACT(HOUR FROM eventHour)

我将“solution”添加到他们的模式中,但他们不应该这样做。 - Matt Mitchell
1
我认为大家都同意这个问题和设置相当奇怪。 - OMG Ponies

3

请问

select * from my_table order by eventDate, eventHour

无法工作?


听起来他们只想要eventDate的日期和eventHour的小时。如果eventDate的小时在该日期的所有结果中不相同,则会在eventHour的小时之前排序。 - Matt Mitchell

1
这是对我有效的最佳方法,只需使用函数 to_days(date) 将日期转换为天数,使用函数 TIME_TO_SEC(time) 将时间转换为秒数,例如:
SELECT 
    nv.destac,
    DATE_FORMAT(nv.date_nov , '%d-%m-%Y %T') as date_order, 
    TO_DAYS(nv.date_nov) as days,
    TIME_TO_SEC(TIME(nv.date_nov)) as seconds

FROM 
    newsviews nv
WHERE 
     nv.active
ORDER BY 
      nv.destac DESC,  days DESC, seconds DESC ;

这是我使用的最佳方法,仅将日期使用函数TO_DAYS(date)转换为天数,并使用函数TIME_TO_SEC(time)将时间转换为秒数。保留html标签。

SELECT 
    nv.destacar,
    DATE_FORMAT(nv.fecha_nov , '%d-%m-%Y %T') as fecha_orden, 
    TO_DAYS(nv.fecha_nov) as dias,
    TIME_TO_SEC(TIME(nv.fecha_nov)) as segundos

FROM 
    novedades nv
WHERE 
     nv.activa
ORDER BY 
      nv.destacar DESC,  dias DESC, segundos DESC ;

1

您可以按照需要使用列表进行排序。它将按照第一个值,然后是第二个值等进行排序。

  SELECT *
    FROM table
ORDER BY eventDate, eventHour

如果您有两个日期时间字段,那么可以使用类似以下的方式仅获取日期或仅获取小时:
    SELECT *
      FROM table
  ORDER BY DATE_FORMAT(eventDate, '%d'), DATE_FORMAT(eventHour, '%h')

听起来他们只想要 eventDate 的日期和 eventHour 的小时。如果 eventDate 上的事件小时对于该日期的所有结果不相同,则会在 eventHour 的小时之前排序。 - Matt Mitchell

1
按照id的降序对其进行排序。 <?php $sql = "SELECT * FROM posts ORDER BY id DESC?> 这应该可以工作。

0
首先,将日期和时间保存在不同的字段中是不好的做法。
无论如何,假设您正在以正确的格式保存日期/时间。 (即:日期格式为yyyy-mm-dd,时间为hh:ss)
您首先需要连接日期和时间以获取datetime值。 从技术上讲,您可以在Datetime字段上执行ORDER BY,但这又是不好的做法。 在我们的情况下,当我们运行CONCAT时,它会被转换为字符串,因此结果集将是错误的。 因此,您需要将其转换为UNIX TIMESTAMP才能进行排序。
在ORDER BY子句之前,在datetime字段上运行UNIX_TIMESTAMP是一个好习惯。
您可以使用以下查询。
SELECT column1,column2, UNIX_TIMESTAMP(CONCAT(event_date,' ',event_time)) as unixtimestamp from table_name Order by unixtimestamp desc;
注意:(在CONCAT函数中,event_date和event_time之间有一个空格。这里没有显示出来。)

关于“将日期和时间保存在不同的字段中是不好的做法”的问题,就像生活中的许多事情一样,这取决于上下文 :-) 例如,如果您想选择所有在上午10点到下午3点之间的记录而不考虑日期,则分开日期和时间字段几乎肯定会给您带来更高的效率。 - paxdiablo

0

为什么不使用TIMESTAMP来连接这两个字段?

首先,我们需要将eventDate字段转换为DATE类型,为此,我们将使用DATE()函数:

SELECT DATE( eventDate );

接下来,将eventHour转换为TIME,类似于这样:

SELECT TIME( eventHour );

下一步是将这两个函数合并成一个TIMESTAMP函数:
SELECT TIMESTAMP( DATE( eventDate ), TIME( eventHour ) );

是的,但你不需要一个SELECT,而是需要一个ORDER BY,所以一个完整的例子会像这样:

SELECT e.*, d.eventDate, t.eventHour
FROM event e
JOIN eventDate d
     ON e.id = d.id
JOIN eventTime t
     ON e.id = t.id
ORDER BY TIMESTAMP( DATE( d.eventDate ), TIME( t.eventHour ) );

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接