在将 .NET DateTime(默认时间(DateTime))转换为 SqlDateTime 时,我是否应该始终检查 .NET 日期是否介于 SqlDateTime.MinValue 和 SqlDateTime.MaxValue 之间 [或] 是否有一个好方法可以做到这一点。
6 回答
日期是否可能实际上超出该范围?它来自用户输入吗?如果这两个问题的答案是肯定的,那么您应该经常检查 - 否则您的应用程序容易出错。
您可以很容易地格式化日期以包含在 SQL 语句中:
var sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd HH:mm:ss");
如果您正在检查 DBNULL,将 SQL 日期时间转换为 .NET 日期时间应该不是问题。但是,将 .NET DateTime 转换为有效的 SQL DateTime 时可能会遇到问题。
SQL Server 无法识别 1753 年 1 月 1 日之前的日期。那一年英格兰采用了公历。通常检查 DateTime.MinValue 就足够了,但如果您怀疑数据可能早于 18 世纪,则需要进行另一次检查或使用不同的数据类型。(我经常想知道博物馆在他们的数据库中使用什么)
检查最大日期并不是真正必要的,SQL Server 和 .NET DateTime 的最大日期都是 12/31/9999 这可能是一个有效的业务规则,但不会导致问题。
另外请记住分辨率[时间量]是不同的。
http://msdn.microsoft.com/en-us/library/system.data.sqltypes.sqldatetime.aspx
SQL 一是 3.33 ms,.net 一是 100 ns。
在我寻求与实体一起做这件事时,我偶然发现了这里,只是回击发布我发现的内容......
使用 EF4 时,可以使用 BitConverter 从 .NET 的 DateTime 填充“a sql”日期时间列。
EntitieObj.thetime = BitConverter.GetBytes(DateTime.Now.ToBinary());
Fakrudeen 的链接也让我更进一步......谢谢。
- 要仅比较日期部分,您可以执行以下操作:
var result = db.query($"SELECT * FROM table WHERE date >= '{fromDate.ToString("yyyy-MM-dd")}' and date <= '{toDate.ToString("yyyy-MM-dd"}'");
var sqlCommand = new SqlCommand("SELECT * FROM mytable WHERE start_time >= @StartTime");
sqlCommand.Parameters.Add("@StartTime", SqlDbType.DateTime);
sqlCommand.Parameters("@StartTime").Value = MyDateObj;