这个sql语句可以缩短吗?

时间:2015-02-02 20:37:13

标签: sql postgresql

我对PostgreSQL数据库有这个SQL查询。可以缩短吗?我正在考虑 where 部分。

SELECT *
FROM reservations
WHERE (starts_at BETWEEN ? AND ?) OR (ends_at BETWEEN ? AND ?)

问号的值是:

  • 日期时间格式的当前日期的开头
  • 以datetime格式结束当前日期
  • 与第一点相同
  • 与第二点相同

该代码旨在返回在特定日期开始或结束的所有预订。并按照预期的方式工作。但我必须多次向查询提供相同的信息。

我实际上并没有真正使用这个SQL,所以某处可能会出现明显错误,但请关注where where

2 个答案:

答案 0 :(得分:4)

在这种情况下,我不是BETWEEN的忠实粉丝,因为timestampdatetime可以是小数。特别是,指定给定日期的最后一个可能值要比指定第一个可能的值(午夜)复杂得多,因为您必须将时间指定为23:59:59.999 ......以及RDBMS使用的精度。例如,PostgreSQL的timestamp应精确到微秒(1e-6秒),因此很容易指定一个范围,其中包括您不想要的时间或者错过了你做的次数。

另一方面,如果您在第二天的午夜使用BETWEEN,那么您不必知道时间的精确度,那么您需要包含的时间不是&#39 ; t存在于您感兴趣的日期。如果您的应用程序仅精确到秒,或分钟,或5分钟,那么您可能会对数据进行错误分类,或者更糟糕的是,因为它突然被计算两次算作两个日期。

我更愿意:

WHERE (starts_at >= ? AND starts_at < ?) 
    OR (ends_at >= ? AND ends_at < ?)

?映射到的地方:

  1. 目标日期的午夜。
  2. 目标日期之后的日期的午夜。
  3. 目标日期的午夜。
  4. 目标日期之后的日期的午夜。
  5. 它并不短,但它确实更安全,除非你真的想要精确地指定你的间隔。

    但是,您应该执行以下操作,即使它更短:

    WHERE DATE(starts_at) = ?
        OR DATE(ends_at) = ?
    

    你不想这样做,因为它不是SARGEable

    这也是为什么简短或简洁是衡量代码质量的一个例子。一般来说,我会这样订购我的偏好:

    1. 精度。
    2. 性能。
    3. 可读性/可维护性。
    4. 简洁。

答案 1 :(得分:2)

不,你无法改善这一点。

WHERE (starts_at BETWEEN ? AND ?) OR (ends_at BETWEEN ? AND ?)