(日期和时间)的多重排序在MYSQL中不起作用

时间:2018-10-09 03:32:31

标签: mysql

我正在组合多个表,进行过滤,然后按某种格式排序。每当我尝试按日期和时间排序时,都会弄乱输出。

SELECT
     t1.empid,t2.lastName,t2.firstName
    ,t1.date as "OVERBOOKED DATE",t1.sfrom,t1.dept as "dname"
    ,t3.manager as "MANAGER" 
from schedule_2 as t1 
INNER JOIN employees_2 as t2 ON t1.empid = t2.empid 
INNER JOIN dept_heads as t3 ON t1.dept = t3.Dept_name 
JOIN  ( SELECT empid,date from schedule_2 
GROUP BY empid,date 
having count(empid)>1
) inr  on inr.empid=t1.empid and inr.date=t1.date 
ORDER BY empid ASC, "OVERBOOKED DATE"  ASC, sfrom ASC;

我附加了输出的代码段和预期输出的代码段。我对此并不陌生,不胜感激!

[Current Output

[Expected Output

2 个答案:

答案 0 :(得分:2)

您的问题是sfrom列中的值不是DATE函数的有效输入(就像在“当前输出”查询中使用它一样)。您需要使用STR_TO_DATE将它们转换为有效值以进行排序,即将sfrom子句中的DATE(sfrom)(或ORDER BY)替换为

ORDER BY empid ASC, "OVERBOOKED DATE"  ASC, STR_TO_DATE(sfrom, '%h%p') ASC

修改

正如@TimBiegeleisen所指出的,"OVERBOOKED DATE"只是一个字符串文字,对于原始列名(t1.date),常规名称别名({{ 1}})或反引号中的别名,例如

OVERBOOKED_DATE

答案 1 :(得分:0)

您要分别存储日期和时间,通常这不是一个好主意,因为它通常会导致完全像您现在面临的问题一样的问题。假设您时间字符串的小时部分是固定宽度,并且ORDER BY empid ASC, `OVERBOOKED DATE` ASC, STR_TO_DATE(sfrom, '%h%p') ASC 按升序正确排序,我们可以尝试以下操作:

AM/PM

注意:ORDER BY empid, OVERBOOKED_DATE, -- DON'T use aliases with spaces, if you plan to order by them RIGHT(sfrom, 2), LEFT(sfrom, 2); 似乎是按字符串文字排序的,实际上根本没有排序。而是使用以下别名:

ORDER BY "OVERBOOKED DATE"

然后按此单个术语别名排序。