2012-05-17 33 views
-2

这给了我一个char数据类型的错误 -SQL查询来按降序排列显示按日期排序的记录,我有一个错误

转换为日期时间数据类型导致 一个不折不扣的 - 范围日期时间值。

这并不工作,并曾试图这样过,但这个订单按日期不是一个月

SqlCommand cmd = new SqlCommand("select * from tbl_Member where Email LIKE '" + id.ToString() + "%' ORDER BY YEAR(RegisterDT) DESC,MONTH (RegisterDT) DESC, DAY(RegisterDT) DESC", con); 


SqlCommand cmd = new SqlCommand("select * from tbl_Member where Email LIKE '" + id.ToString() + "%' ORDER BY(RegisterDT) DESC", con) 
+1

“RegisterDT”列是日期吗?如果是这样,发布的值的例子, –

+0

列日期 –

回答

3

当张贴问题,这是一个好主意,让表格格式,数据库您正在使用和采样数据。在这种情况下,我推测你正在使用SQL Server,因为你正在使用DAY()和MONTH()函数。

这些函数将日期作为arugments而不是字符串。您不应该依赖SQL中的隐式转换。让我重复一遍。您应该总是明确地在数据类型之间进行转换,以防止出现类似您所看到的错误。

您遇到的问题是您的日期格式不是系统的默认格式。例如,你可能有一个像10/03/2012的日期。这是10月3日,美国人会相信吗?或者是在3月10日,像欧洲人那样?然后考虑2012年10月20日。这对欧洲人来说是不合适的。

所以,你有两个选择:

(1)做一个明确的转换,使用CONVERT()函数。

(2)使用字符串函数提取月份和日期。在上述情况下,这可能是一个子字符串(,1,2),另一个是子字符串(,4,2)。

+0

谢谢吨... –

2

我的猜测是RegisterDT是一个字符列,并且您在当前的日期设置(DMY | MDY)中存在无效的日期。日期应该存储为日期,而不是字符串。这应该可以解决您的问题。

作为第一方面,如果RegisterDT是一个日期列,为什么你不得不在年,月份日将其分解?你为什么不能只是ORDER BY RegisterDT DESC

作为最后一点BEWARE SQL INJECTION。您应该使用paramerised查询,像这样:

SqlCommand cmd = new SqlCommand("SELECT * FROM tbl_Member WHERE Email LIKE @ID + '%' ORDER BY RegisterDT DESC", con); 
cmd.Parameters.Add("@ID", SqlDbType.Varchar).Value = id.ToString(); 

这不仅elimates SQL注入,这也使得代码更易读通过分离值SQL,并通过字符串转换站的数据丢失。