.NET DateTime转换为SqlDateTime

53

在将.NET DateTime(默认为DateTime的情况下)转换为SqlDateTime时,我是否应该始终检查.NET日期是否介于SqlDateTime.MinValue和SqlDateTime.MaxValue之间?还是有更好的方法来实现这一点。


50
没问题,@JohnSaunders说的话有点挑剔。 - user1228
6个回答

96

日期是否可能超出该范围?这个日期来自用户输入吗?如果这两个问题的答案都是肯定的,则应始终进行检查-否则,您的应用程序容易出现错误。

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

var sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd HH:mm:ss");

17
@Winston:你不应该将日期格式化为字符串来包含在 SQL 语句中。相反,应该使用具有强类型参数的参数化 SQL。 - LukeH
6
我同意Luke的看法。假如你出生于"用户"月份表格的"用户"位置,而且是在"删除"年份,会怎样呢?(说真的,按照Luke说的去做吧) - Rob Fonseca-Ensor
4
使用 .NET DateTime 对象无法实现,因为格式是直接从数字值转换而来的。 - marknuzz
2
@Sam:除了Rob提到的安全问题之外,yyyy-MM-dd格式并不完全独立于文化。更多细节请参见此处:https://sqlblog.org/2009/10/16/bad-habits-to-kick-mis-handling-date-range-queries - LukeH
1
@Sam:我不知道在OP的实际情况下是否可能/可能发生类似的攻击;我宁愿使用适当的参数化SQL来避免风险。 - LukeH
显示剩余5条评论

2
如果你要检查DBNULL,将SQL日期转换为.NET日期不应该有问题。然而,将.NET日期转换为有效的SQL日期可能会遇到问题。
SQL Server无法识别1753年1月1日之前的日期。那是英格兰采用公历的那一年。通常检查DateTime.MinValue就足够了,但如果你怀疑数据可能包含18世纪以前的年份,你需要进行另一个检查或使用不同的数据类型。(我经常想知道博物馆在他们的数据库中使用什么)
实际上,检查最大日期并不是必需的,因为SQL Server和.NET DateTime都具有9999年12月31日的最大日期。这可能是一个有效的业务规则,但不会导致任何问题。

1
在我使用实体框架进行这个任务的过程中,我偶然发现了这里,现在回来分享一下我的发现...
当使用EF4时,“一个SQL”的日期时间列可以通过使用BitConverter从.NET的DateTime填充。
EntitieObj.thetime = BitConverter.GetBytes(DateTime.Now.ToBinary());

同时,Fakrudeen的链接让我更深入地了解了这个问题...谢谢。


1

0

-要仅比较日期部分,您可以这样做:

var result = db.query($"SELECT * FROM table WHERE date >= '{fromDate.ToString("yyyy-MM-dd")}' and date <= '{toDate.ToString("yyyy-MM-dd"}'");

0
var sqlCommand = new SqlCommand("SELECT * FROM mytable WHERE start_time >= @StartTime");
sqlCommand.Parameters.Add("@StartTime", SqlDbType.DateTime);
sqlCommand.Parameters("@StartTime").Value = MyDateObj;

1
虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。来自审核 - double-beep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接