【问题标题】:SQL data error: The conversion of a varchar data type to a datetime data type resulted in an out-of-range valueSQL 数据错误:将 varchar 数据类型转换为 datetime 数据类型导致值超出范围
【发布时间】:2016-01-22 17:28:26
【问题描述】:

我有一个返回此错误的 SQL 查询:

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围

这是查询:

POQuery = "SELECT Distinct PurchaseOrders.POrderID, PurchaseOrders.VendorName, PurchaseOrderDetail.ArrDate "
          + "FROM PurchaseOrders "
          + "FULL JOIN PurchaseOrderDetail ON PurchaseOrders.POrderID = PurchaseOrderDetail.POrderID "
          + "WHERE PurchaseOrders.Buyer = @Buyer and ArrDate >= convert(DateTime, '"
          + datePickerStart.Value.ToString("mm/dd/yyyy") + "') and ArrDate <= convert(DateTime, '"
          + datePickerEnd.Value.ToString("mm/dd/yyyy") + "')";

我正在使用日期选择器来选择日期。

【问题讨论】:

  • 来吧 - 更努力地格式化问题
  • 对不起,我是新手,这是一种紧急情况。
  • 发布 POQuery 的值 - 正是发送到 SQL 的内容
  • datePickerStart.Value.ToString = 1/22/2016 9:14:44 AM && datePickerEnd.Value.ToString 具有相同的值
  • 您确实应该使用参数,那么您不需要将DateTime转换为字符串,只需将其转换回SQL中的日期即可。

标签: c# sql-server


【解决方案1】:

您的问题与文化有关...您永远不应该依赖特定于文化的日期时间格式!否则,您必须告诉 T-SQL CONVERT 函数特定格式(在您的情况下应该是 101)...

试试这个:

SET LANGUAGE ENGLISH;
SELECT CONVERT(datetime, '1/22/2016 9:14:44 AM'); --works
GO
SET LANGUAGE GERMAN;
SELECT CONVERT(datetime, '1/22/2016 9:14:44 AM'); --error
GO
SET LANGUAGE GERMAN;
SELECT CONVERT(datetime, '1/22/2016 9:14:44 AM',101); --works

最好使用 ISO8601 2016-01-22T18:59:00

或其中一种 ODBC 格式

{d'2016-01-22'}
{t'18:59:00'}
{ts'2016-01-22 18:59:00'}

这样做,您甚至不必调用 convert...

而且 - 正如其他人所指出的 - 你应该使用参数而不是连接字符串......

【讨论】:

  • 另外,yyyymmdd hh:mm:ssyyyymmdd(没有破折号)也是 100% 可靠的。
  • @ErikE 你是对的 - 这是一个偏好问题......我不喜欢“裸数字”日期格式,因为它可能被误认为是数字......
猜你喜欢
  • 2014-07-06
  • 1970-01-01
  • 2014-01-17
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 2016-02-08
相关资源
最近更新 更多