将参数传递给MS-Sql存储过程时的DateTimeFormat问题

时间:2012-10-25 13:09:25

标签: c# sql-server-2008

当我将值@CurrentDate datetime从前端(C#)传递给此存储过程时,我有一个存储过程,其参数类似DateTime.Now工作正常。

但是当我在系统/服务器中将日期格式更改为English(India)时,该时间DateTime.Now将返回25-10-2012 PM 05:23:27之类的值。我将此值传递给存储过程,我收到如下错误消息,

Msg 242, Level 16, State 3, Line 10
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

注意:我不想在Sqlserver中使用GETDATE(),我想从c#传递参数。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

日期格式的问题是因为您将其转换为字符串然后再转换为DateTime值。根据特定服务器上的区域性设置,这可能有效,也可能无效。它也可能误解数据,例如:将日期从2013-10-12改为2013-12-10。

DateTime datet = new DateTime(year,month,day);
  startDateParam.Value = datet;
  endDateParam.Value = datet;

“请注意服务器存储的日期时间格式为'1900-01-01 00:00:00.000'”

答案 1 :(得分:0)

您需要使用Convert函数将值转换为有效的DateTime。

有关详细信息:http://www.sql-server-helper.com/tips/date-formats.aspx

答案 2 :(得分:0)

在国际发布时,在当地时区存储日期会引起头痛。 如果在SQL Server端使用GETUTCDATE()保存当前日期,则可以按如下方式在用户特定时区获取时间:

public DateTime GetDateByTimeZoneId(DateTime dateTime, string timeZone)
{
   if (dateTime == null)
   {
        return null;
   }

   dateTime = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc);
   return TimeZoneInfo.ConvertTimeFromUtc(dateTime, TimeZoneInfo.FindSystemTimeZoneById(timeZone));
}

然后,您可以传递用户相关的时区,例如"GMT Standard Time"

答案 3 :(得分:0)

您可以在C#中使用此转换。希望这有帮助

DateTime.Now.ToString(DateTimeFormatInfo.InvariantInfo)