实体框架中的DateTime &&sql格式的DateTime返回不同的结果

本文关键字:DateTime 结果 返回 格式 框架 实体 sql | 更新日期: 2023-09-27 18:10:48

伙计们,我在实体框架和DateTime有一个大问题。问题在这里:

First with entity:

当用户提交表单时,将根据用户类型的参数为条件查询创建这些值。例子:

var query =  from user in UserTable
select user;
        if(Request.Form["Category"])
        {
        query = query.where(add=>add.Category == Request.Form["Category"])
        }
       
//and here the between 
         if(Request.Form["start_date"] && Request.Form["end_date"])
        {
        query = query.where(add=>add.Date < Request.Form["start_date"] && add.Date > Request.Form["end_date"] )//equivalent to between
        }
    until...
    return query.ToList();

很好,但是问题仍然存在,当用户想要按日期搜索时,当将请求表单转换为datetime时,格式与接收到的输入不同:

User'input
2003-12-02

Convert.ToDateTime
result : 02/11/2003(not iqual to the user input)

所以,这不是巧合(嗯,这就是我想要的,因为我读到那个实体自己解决了这个问题)。我不能将日期属性设置为字符串,因为我不能与字符串一起使用between。

模型简化如下:

public string Category {get;set;}
public DateTime Date{get;set;} 

但这不是全部

第2部分

我试图在02/11/2003格式查询,看看查询是否有效,它做得正确,但当我尝试2003-12-02,这里的结果

 02/12/2003 format
16330 rows
2003-12-02 format
136 rows

注意它们是相同的,但是返回不同的结果。此外,当我检查结果时,我注意到在02/12/2003 format中查询时,结果包括更小或更高的日期:

的例子:

Select date FROM Table WHERE date BETWEEN 02/12/2003 AND  03/12/2003
results include: 05/12/2003,30/12/2003

为什么这两个查询之间有如此显著的差异?

实体框架中的DateTime &&sql格式的DateTime返回不同的结果

这与数据库的区域性有关。您可以执行以下命令检查当前区域性:

SELECT @@language

若要查看区域性的日期格式,请执行:

EXEC sp_helplanguage

基于此,您可以在c#中使用您的特定文化进行Convert.ToDateTime(),如下所示:

更新答案

DateTime startDate = DateTime.MinValue;
DateTime endDate = DateTime.MaxValue;
// Set this to your culture if it's not en-US
DateTimeFormatInfo usDtfi = new CultureInfo("en-US", false).DateTimeFormat;
try { startDate = Convert.ToDateTime(Request.Form["start_date"], usDtfi); }
catch {}
try { endDate = Convert.ToDateTime(Request.Form["end_date"], usDtfi); }
catch {}
if (startDate != DateTime.MinValue && endDate != DateTime.MaxValue)
{
    query = query.where(add=>add.Date <= endDate && add.Date >= startDate ) //equivalent to between
}

注意你把日期倒了。你有 endDate。这与BETWEEN相反。(除非你认为startDate是两个日期中较大的一个,而我不是)