-2

这给了我一个错误-

将 char 数据类型转换为 datetime 数据类型会导致 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)
4

2 回答 2

3

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

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

您遇到的问题是您的日期格式不是系统的默认格式。例如,您可能有一个日期,例如 10/03/2012。正如美国人所相信的那样,这是 10 月 3 日吗?还是像欧洲人那样,今年 3 月 10 日?然后考虑 2012 年 10 月 20 日。这对欧洲人来说超出了范围。

所以,你有两个选择:

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

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

于 2012-05-17T10:39:26.197 回答
2

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

作为第一方面,如果 RegisterDT 是一个日期列,为什么你必须按年、月日分解它?你为什么不能ORDER BY RegisterDT DESC呢?

最后一点要小心 SQL 注入。您应该使用这样的参数化查询:

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 与值分离,使代码更具可读性,并通过字符串转换防止数据丢失。

于 2012-05-17T10:40:10.490 回答