按字符串将SQL查询排序为字符串

时间:2016-12-19 22:24:25

标签: sql sql-server

我正在努力根据其他人为其创建数据库的数据创建一些报告,并且无法获得正确的排序。

此报告应显示最近的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的区别。

任何帮助将不胜感激。

2 个答案:

答案 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

您可以在本教程https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_1_.28date-time_and_MAC_address.29

中了解有关日期时间格式的更多信息