我正在努力根据其他人为其创建数据库的数据创建一些报告,并且无法获得正确的排序。
此报告应显示最近的20个条目,但数据不包含时间戳,而是使用两个单独的varchar字段创建,一个用于MM/dd/yyyy
格式的日期,另一个用于时间格式为HH:mm:ss AM/PM
。当我尝试选择最新数据时,这会导致问题。
当我使用时:
SELECT top 20 * FROM SignIn order by Checkin desc, Intime desc
我得到了正确的日期,但是时间是从上午9:59开始的值,并且在下午7点之后立即按字母顺序从早上6点开始。
在做了大量研究之后,我尝试了其他一些事情:
SELECT * FROM SignIn order by Checkout desc, CONVERT(varchar(30), outtime, 101) desc
结果是一样的。
我在MS SQL中做的不多,我对MySql更流利,并且从未见过任何理由将日期存储为直字符串。我无法正确排序。
我尝试使用html,php和javascript处理排序和显示来创建报告,而不是让SQL只访问第一个记录,但加载时间很荒谬,因为它加载了完整的5000个数据然后排序他们和剪辑除了前20个。
尽我所能,我目前无法更改数据库存储,因此我需要一些可以与varchars一起使用的东西,并尽可能处理am \ pm的区别。
任何帮助将不胜感激。
答案 0 :(得分:4)
您可以将两列和cast
结果连接为datetime
并将其用于排序。
SELECT top 20 *
FROM SignIn
ORDER BY cast(Checkout+' '+outtime as datetime) desc
请注意,这假设所有日期和时间都有效。如果您的值可能不正确,请使用try_cast
(对于SQL Server版本2012及更高版本)
SELECT top 20 *
FROM SignIn
WHERE try_cast(Checkout+' '+outtime as datetime) is not null --invalid values get filtered out
ORDER BY cast(Checkout+' '+outtime as datetime) desc
答案 1 :(得分:1)
您必须连接日期时间列并转换为日期,如下所示:
SELECT * FROM SignIn order by CONVERT(DATETIME, [dateColumn] + ' ' + [TimeColumn], 101) desc
中了解有关日期时间格式的更多信息