我正在组合多个表,进行过滤,然后按某种格式排序。每当我尝试按日期和时间排序时,都会弄乱输出。
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;
我附加了输出的代码段和预期输出的代码段。我对此并不陌生,不胜感激!
[
[
答案 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"
然后按此单个术语别名排序。