【问题标题】:DateTime in entity Framework && DateTime in sql format returning different results实体框架中的日期时间 && sql格式的日期时间返回不同的结果
【发布时间】:2013-04-24 15:53:57
【问题描述】:

伙计们,我在实体框架和日期时间方面有一个大问题。问题来了:

首先是实体:

当用户提交表单时,这些值将根据用户输入的参数创建用于条件查询。示例:

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();

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

User'input
2003-12-02


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

所以,这不是巧合(嗯,这就是我的客人,因为我读到那个实体自己解决了这个问题)。而且我不能将日期属性设置为字符串,因为我不能在字符串之间使用。

这里的模型简化了:

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

为什么这两个查询之间存在如此显着的差异?

【问题讨论】:

  • 不是一个真正的答案,但是当您使用 02/12/2003 时,这将转换为 2003 年 2 月 12 日,2003-12-02 转换为 2003 年 12 月 2 日。所以它与您的日期文化有关。
  • 赞成,您回答了我的一个问题:D。

标签: c# sql sql-server entity-framework asp.net-mvc-4


【解决方案1】:

这与您的数据库文化有关。您可以通过执行以下命令检查您当前的文化:

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 是两个日期中较大的一个,但我不是。)

【讨论】:

  • 执行您所写的操作时,结果如下:Convert.ToDateTime("2012-09-11");//它返回 12/09/2012 12:00:00 a.m. 但在日期字段,格式为 02-12-2012。如何更改 dateformat 和 with - 并在 dateFormat 中进行 between 声明?请记住,我无法在字符串和 DateTime 之间做出选择(DateTime > String)//错误,无法将 dataTime 与字符串进行比较。
  • 这是为你解答的吗?
  • 是的,确实如此。很抱歉之前没有投票:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
相关资源
最近更新 更多