【问题标题】:Return DB results within Date Range返回日期范围内的数据库结果
【发布时间】:2014-12-01 19:11:28
【问题描述】:

在我看来,我有一个输入和选择标签供用户输入开始和结束日期。 提交后,控制器将搜索模型/数据库并返回上述范围内的条目。

在我的数据库中,开始和结束日期写为“nvarchars”,在我的控制器中它们被视为字符串

代码和图片供参考:

public ActionResult timePeriod(string time)
{
    //Start: month, day, year End: month, day, year --> Numeric values
    string[] times = time.Split(',');                             
    string start = times[0] + " " + times[1] + " " + times[2];
    string end = times[3] + " " + times[4] + " " + times[5];

    //Sample code to test the start date
    viewModel.Tasks = db.Tasks.Where(s => s.StartTime.Contains(start)).ToList();
}

数据库值的 sn-p:

是否有任何 LINQ 表达式可以做到这一点?

【问题讨论】:

  • 为什么日期不存储为datetime?将它们存储为nvarchar 似乎不寻常
  • 不幸的是,我无法更改数据库,因此必须处理日期为 varchars

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


【解决方案1】:

由于日期是字符串,所以除了使用您已经建议的内容之外没有什么比这更好的了:

viewModel.Tasks = db.Tasks.Where(s => s.StartTime.Equals(start)).ToList();

我会使用Equals,因为这对你来说会更快。使用 Contains 基本上就像执行 T-SQL LIKE 一样慢得多。

SELECT *
FROM Table
WHERE StartDate LIKE 'blah'

使用Equals 将产生以下等价物:

SELECT *
FROM Table
WHERE StartDate = 'blah'

效率更高。

【讨论】:

  • 好的,感谢您的回复,也许我需要与数据库管理员交谈以更改日期的类型。
  • 我建议这样做,因为这些日期是 datetime 值是有意义的。但是,如果数据库已经创建并正在使用,那么现在更改类型可能为时已晚。
  • 该项目仍在开发中,所以值得一问,因为我可以想象在日期之间获取所有数据库条目的逻辑会很复杂。
  • 你已经一针见血了。使用nvarchar,您无法轻松获得两个日期之间的日期范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多