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