我正在调试一个用C#构建的查询,可能是EntityFrameWork - 不确定 - 但它不会返回任何记录,尽管它应该。
该查询包含一些DateTime
字段,它们是这样的:
personStartDate {4/3/2013 12:00:00 AM}
Date
的值来自用户界面日期选择器,但我想它也会以某种方式将时间部分默认为12:00:00 AM
。
然后我转到SQL Server并在其datatime字段数据上查看表行和值,如下例所示:'2013-04-23 09:20:38.897'
你在那里看到任何明显的问题吗?
此外,我正在尝试从C#中的断点处生成SQL并将其发布到SQL Server以查看它返回的内容,因此对于{4/3/2013 12:00:00 AM}
这样的值我将其替换为2013-04-03 12:00:00.000
这是否正确?
答案 0 :(得分:5)
格式化无关紧要。在内部,它根本不会是文本格式,我希望查询最终不会将查询值作为文本发送到数据库。
如果您只对日期部分感兴趣,则需要在查询中说明:
where foo.Start.Date == personStartDate
(例如 - 我们不知道您的查询是什么样的。)
如果数据库中的字段逻辑仅为Date
但当前为DateTime
,则应考虑更改架构以匹配逻辑数据模型。它会让事情变得更简单。
答案 1 :(得分:2)
如果使用DateTime
创建DateTime.Today
,则时间部分将默认为午夜。这就是日期选择器正在做的事情。
您的数据库也包含时间部分。如果这不正确,您可以在sql中转换它:Best approach to remove time part of datetime in SQL Server
2013-04-03 12:00:00.000
中午是12:00:00 PM
。你想要午夜的12:00:00 AM
。您应该在测试中使用2013-04-03 00:00
或2013-04-03
或'2013年4月3日'。同样,时间部分将默认为00:00
。
要使查询在c#中使用数据库中的“错误”数据,请通过“少于明天大于或等于今天”而不是“等于”来使查询不那么精确。或者通过删除时间部分使数据库更精确 - 然后你可以使用“等于”。如果您使用的是Entity Framework和Linq-to-Entities,则可能需要使用EF的DbFunctions
理想情况下,您应该跟踪在数据库中设置时间的插入和更新并停止发生,然后修复现有数据。然后,您可以将数据库中的数据类型从DateTime
更改为Date
。
答案 2 :(得分:1)
Sql Server DateTime
值是一对32位整数。第一个是SQL Server日历的 epoch (1900年1月1日00:00:00.000)的天数;第二个是从一天开始以来的毫秒数。
它的字符串表示取决于(A)SQL Server实例的默认语言设置,(B)会话的当前语言设置,(C)当前set dateformat
设置,可能还有我忘记了很少的其他选择。
如果您关心字符串表示,请使用您选择的样式使用convert(varchar(X),your-datetime-value-here,style)
将其显式转换为字符串。
请注意,运行时将SQL Server Date
和DateTime
值转换为System.DateTime
值。