不同框架语言之间的SQL日期

时间:2011-10-20 18:08:19

标签: c# sql-server datetime

我有这个问题:

SqlCommand cmdImpRN = new SqlCommand("SELECT COUNT(*) FROM copies WHERE DATEADD(dd, 0, DATEDIFF(dd, 0, DATE_TIME_COLUMN)) = @Date;", conn);
cmdImpRN.Parameters.AddWithValue("@Date", DateTime.Now.ToString("MM-dd-yyyy"));
n_i_rn = (int)cmdImpRN.ExecuteScalar();

此查询旨在返回DATE_TIME_COLUMN日期(非时间)等于今天日期的副本数。我目前正在部署到各种.NET框架本地环境,因此我确保将@Date添加为“MM-dd-yyyy”,并且它正常工作,直到某个客户端购买并安装西班牙语的SQL Server。现在,该应用程序无法处理抛出异常,例如:

  

将nvarchar数据类型转换为日期时间数据类型   导致超出范围的值

看来我能做到这一点:

cmdImpRN.Parameters.Add(new SqlParameter("@Date", SqlDbType.Date){Value = DateTime.Now })

但我不确定这是不是这样。为什么?因为我不知道DateTime.Now是否为安装的不同.N​​ET Framework语言返回不同,因为我不知道该构造函数是否会创建一个有效的Date对象,无论DateTime.Now的返回是否在MM-dd- yyyy格式或dd-MM-yyyy格式。

有什么建议吗?提前致谢。

2 个答案:

答案 0 :(得分:2)

您只使用DateTime.Now是正确的。 DateTime.Now始终返回最终用户配置的时区的正确日期。发生的事情是日期以二进制格式(不依赖于语言环境)发送到服务器,而不是作为字符串,服务器直接与该二进制格式进行比较,避免任何特定于语言环境的日期格式问题。

答案 1 :(得分:1)

使用DateTime.Now.Date。它已经是一个DateTime和格式mm / dd / yyyy无关紧要。 更好的是,习惯UTC日期和时间,这样您就不必担心用户本地时间,服务器本地时间以及您拥有的内容。

Date属性本身没有时间部分(它设置为午夜)。

http://msdn.microsoft.com/en-us/library/system.datetime.date.aspx