sql查询显示按日期降序排序的记录,我有一个错误

时间:2012-05-17 10:27:59

标签: asp.net sql-server

这给了我一个错误 -

  

将char数据类型转换为datetime数据类型   超出范围的日期时间值。

这不起作用,也试过这个,但这个按日期排序而不是月份

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)

2 个答案:

答案 0 :(得分:3)

发布问题时,最好提供表格格式,正在使用的数据库以及示例数据。在这种情况下,我推测您使用的是SQL Server,因为您使用的是DAY()和MONTH()函数。

这些函数将日期视为arugments,而不是字符串。您不应该依赖SQL中的隐式转换。让我再说一遍。您应该始终在数据类型之间进行显式转换,以防止您看到的错误。

您遇到的问题是您的日期格式不是系统的默认格式。例如,您可能会有一个类似10/03/2012的日期。这是10月3日,美国人会相信吗?或者是3月10日,欧洲人会这样做吗?然后考虑10/20/2012。它超出了欧洲人的范围。

所以,你有两个选择:

(1)使用CONVERT()函数进行显式转换。

(2)使用字符串函数提取月和日。在上面的例子中,这可能是一个子串(,1,2),另一个是子串(,4,2)。

答案 1 :(得分:2)

我的猜测是RegisterDT是一个char列,你当前的日期设置(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();

这不仅可以消除SQL注入,还可以通过将SQL与值分离来使代码更具可读性,并通过字符串转换来阻止数据丢失。