2016-12-01 102 views
1

按日期排序会给出错误的输出。输入的日期是以字符串或Varchar(50)的形式输入和存储的,所以当我对它进行排序时,它只采用了示例“22-11-2016”的第一部分,所以“22”。太澄清:这是我出来就是:按日期排序字符串MSSql

enter image description here

用下面的查询字符串:

SELECT TOP 1 CHECKEDIN, DATE 
FROM timereg 
WHERE UNILOGIN = @unilogin 
ORDER BY DATE DESC, TIME DESC 

,并明确列9应该是在上面,因为它后来是一个月。 我将如何将其以某种方式转换为日期时间并对其进行排序,以便它实际上可以正常工作,或仅在整个字符串之后进行排序。

-Thanks

+3

使用正确的数据类型。不要将日期存储在varchar(或类似的)中。 – jarlh

+0

这个字段不是日期类型,sql服务器的日期格式是YYYY-MM-DD – freakydinde

+1

'ORDER BY convert(DATE,DATECOLUMN,105)DESC' –

回答

4

将您VARCHAR到实际日期

... ORDER BY convert(date,DATE,103) DESC 
+0

完全同意这种观点,但对'103'的作品感到惊讶。文档说'103 = dd/mm/yyyy'和'105 = dd-mm-yyyy'。但结果是一样的。奇怪的。 – Leigh

+0

@Leigh分隔符似乎是第二个模式尝试选择转换(日期,'30 -11-2016',103),转换(日期,'30/11/2016',103),转换(日期,'30 .11 .2016',103) –

+0

是的,它绝对有效。我只是感到惊讶,它处理的分隔符与文档中预期的/描述的不同。我可能会使用'105',只是为了一致的缘故,但是..每天学习新的东西:) – Leigh

1

尝试

ORDER BY CONVERT(DATETIME, DATE, 105) DESC 
0

你几乎肯定会采取的性能损失,但你可以尝试列转换为一日期类型时排序。

Order by CONVERT(Datetime, [date], 103) Desc, time DESC