【问题标题】:SQL Query for simple reservation system简单预订系统的 SQL 查询
【发布时间】:2015-02-02 15:51:47
【问题描述】:

我有一个简单的预订系统。 ReservationObject 是一个扁平结构,由 StartDate、EndDate、Resource 等属性组成。

我正在尝试获取资源使用情况报告。对于此报告,我只是查询 StartDate 以查找具有报告查询范围的所有预订并计算它们。

示例 SQL 查询是..

"SELECT * 
 FROM RequestsQueueObjects 
 WHERE PODObjectID='" +cPOD.PODObjectID + "' 
 and StartDateTime >= '" + StartDate + "' 
 and StartDateTime <= '" + EndDate + "'";

我的设计有问题。如果我的预订从 2015 年 1 月 1 日开始到 2015 年 1 月 15 日结束,这将不会显示在 2015 年 1 月 2 日至 2015 年 1 月 7 日的报告中

有没有办法让 SQL 查找两个日期之间的所有预订对象?

【问题讨论】:

  • Look at Between 小心使用 &gt;= and &lt;= 的日期,你不会得到预期的结果,或者你可以检查 StartDateTime &gt;= StartDate and StartDateTime &lt; EndDate 我也会更改该查询以使用 Parameterized Query
  • 嗨 DJ KRAZE,我如何在 Reservation StartDate 和 Reservation EndDate 之间使用 Between。请给我一个例子。
  • ZOO 是什么阻止您在Google Search 上对SQL BETWEEN Examples 进行操作,请多做一点努力..
  • @DJKRAZE 你不应该建议任何人使用 BETWEEN(见 sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/…
  • @DJKRAZE 我会小心建议使用 BETWEEN。这是一个准备以丑陋的方式踢的陷阱。 See this article from Aaron Bertrand当然要看对这些问题的了解有多深。

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


【解决方案1】:

编辑

您想检查日期范围是否重叠。请尝试以下操作:

"SELECT * 
 FROM RequestsQueueObjects 
 WHERE PODObjectID='" +cPOD.PODObjectID + "' 
 and StartDateTime <= '" + EndDate+ "' 
 and EndDateTime >= '" + StartDate + "'";

(结合史蒂夫参数化查询推荐)

【讨论】:

    【解决方案2】:

    使用参数化查询,让数据库引擎找出您传递的日期。
    在您的代码中,您在逗号之间编写日期,这让数据库引擎可以根据其本地化规则翻译它们。当然这可能会导致完全错误的结果或丢失记录

    DateTime startDate = new DateTime(2015, 2, 1);
    DateTime endDate = new DateTime(2015, 7, 1, 23, 59, 59); // add time to Include all day
    
    string cmdText = @"SELECT * FROM RequestsQueueObjects 
                       WHERE PODObjectID = @id 
                       and StartDateTime >= @start
                       and StartDateTime <= @end";
    using(SqlConnection cn = new SqlConnection(.....))
    using(SqlCommand cmd = new SqlCommand(cmdText, cn))
    {
        cn.Open();
        cmd.Parameters.Add("@id", cPOD.PODObjectID);
        cmd.Parameters.Add("@start", StartDate);
        cmd.Parameters.Add("@start", EndDate);
        using(SqlDataReader reader = cmd.ExecuteReader())
        {
            ....
        }
    }
    

    【讨论】:

      【解决方案3】:

      您应该使用具有以下逻辑的参数化查询:

      "SELECT * 
               FROM RequestsQueueObjects 
               WHERE PODObjectID= @PODObjectID  
               and ((StartDateTime >= @StartDate and EndDateTime <= @EndDate)
               OR (StartDateTime <= @StartDate and EndDateTime >= @StartDate)
               OR (StartDateTime <= @EndDate and EndDateTime >= @EndDate)
               OR (StartDateTime <= @StartDate and EndDateTime >= @EndDate))
          ";
      

      虽然上述解决方案有效,但由于 Thomas Haratyk 建议的链接,它可以简化如下。

      http://logic-and-trick.com/Blog/The-Overlapping-Date-Range-Test

      "SELECT * 
                   FROM RequestsQueueObjects 
                   WHERE PODObjectID= @PODObjectID  
                   and EndDateTime >= @StartDate and StartDateTime <= @EndDate
              ";
      

      【讨论】:

      • 没有。当一个期间在选定的开始日期之后结束并在选定的结束日期之前开始时,它与选定的日期范围重叠。 (想想看:))
      • 谢谢大家。我用英语写下了这个查询,但不确定它是否是答案...Reservation-EndDateORStartDate >= Report-STartDAte.... AND Reservation-StartDateOREndate
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多