53

在将 .NET DateTime(默认时间(DateTime))转换为 SqlDateTime 时,我是否应该始终检查 .NET 日期是否介于 SqlDateTime.MinValue 和 SqlDateTime.MaxValue 之间 [或] 是否有一个好方法可以做到这一点。

4

6 回答 6

96

日期是否可能实际上超出该范围?它来自用户输入吗?如果这两个问题的答案是肯定的,那么您应该经常检查 - 否则您的应用程序容易出错。

您可以很容易地格式化日期以包含在 SQL 语句中:

var sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd HH:mm:ss");
于 2010-02-03T10:22:37.567 回答
2

如果您正在检查 DBNULL,将 SQL 日期时间转换为 .NET 日期时间应该不是问题。但是,将 .NET DateTime 转换为有效的 SQL DateTime 时可能会遇到问题。

SQL Server 无法识别 1753 年 1 月 1 日之前的日期。那一年英格兰采用了公历。通常检查 DateTime.MinValue 就足够了,但如果您怀疑数据可能早于 18 世纪,则需要进行另一次检查或使用不同的数据类型。(我经常想知道博物馆在他们的数据库中使用什么)

检查最大日期并不是真正必要的,SQL Server 和 .NET DateTime 的最大日期都是 12/31/9999 这可能是一个有效的业务规则,但不会导致问题。

于 2010-02-03T14:13:23.310 回答
1

另外请记住分辨率[时间量]是不同的。

http://msdn.microsoft.com/en-us/library/system.data.sqltypes.sqldatetime.aspx

SQL 一是 3.33 ms,.net 一是 100 ns。

于 2010-02-05T11:01:57.120 回答
1

在我寻求与实体一起做这件事时,我偶然发现了这里,只是回击发布我发现的内容......

使用 EF4 时,可以使用 BitConverter 从 .NET 的 DateTime 填充“a sql”日期时间列。

EntitieObj.thetime = BitConverter.GetBytes(DateTime.Now.ToBinary());

Fakrudeen 的链接也让我更进一步......谢谢。

于 2011-06-01T21:18:47.520 回答
0

- 要仅比较日期部分,您可以执行以下操作:

var result = db.query($"SELECT * FROM table WHERE date >= '{fromDate.ToString("yyyy-MM-dd")}' and date <= '{toDate.ToString("yyyy-MM-dd"}'");
于 2017-08-28T16:31:17.547 回答
0
var sqlCommand = new SqlCommand("SELECT * FROM mytable WHERE start_time >= @StartTime");
sqlCommand.Parameters.Add("@StartTime", SqlDbType.DateTime);
sqlCommand.Parameters("@StartTime").Value = MyDateObj;
于 2020-05-26T23:22:20.523 回答