我对PostgreSQL数据库有这个SQL查询。可以缩短吗?我正在考虑 where 部分。
SELECT *
FROM reservations
WHERE (starts_at BETWEEN ? AND ?) OR (ends_at BETWEEN ? AND ?)
问号的值是:
该代码旨在返回在特定日期开始或结束的所有预订。并按照预期的方式工作。但我必须多次向查询提供相同的信息。
我实际上并没有真正使用这个SQL,所以某处可能会出现明显错误,但请关注where where
答案 0 :(得分:4)
在这种情况下,我不是BETWEEN
的忠实粉丝,因为timestamp
或datetime
可以是小数。特别是,指定给定日期的最后一个可能值要比指定第一个可能的值(午夜)复杂得多,因为您必须将时间指定为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 < ?)
?
映射到的地方:
它并不短,但它确实更安全,除非你真的想要精确地指定你的间隔。
但是,您应该不执行以下操作,即使它更短:
WHERE DATE(starts_at) = ?
OR DATE(ends_at) = ?
你不想这样做,因为它不是SARGEable。
这也是为什么简短或简洁是衡量代码质量的一个例子。一般来说,我会这样订购我的偏好:
答案 1 :(得分:2)
不,你无法改善这一点。
WHERE (starts_at BETWEEN ? AND ?) OR (ends_at BETWEEN ? AND ?)