gpt4 book ai didi

sql - 这个sql语句可以缩短吗?

转载 作者:行者123 更新时间:2023-11-29 14:04:57 24 4
gpt4 key购买 nike

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

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

问号的值是:

  • 日期时间格式的当前日期的开始
  • 日期时间格式的当前日期结束
  • 同第一点
  • 同第二点

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

我实际上并没有完全使用这个 SQL,所以某处可能存在明显的错误,但请关注 where 部分

最佳答案

在这种情况下,我不太喜欢 BETWEEN,因为 timestampdatetime 可以是小数。特别是,指定给定日期的最后一个可能值比指定第一个可能值(午夜)要复杂得多,因为您必须将时间指定为 23:59:59.999... 无论 RDBMS 使用什么精度。例如,PostgreSQL 的 timestamp 应该精确到微秒(1e-6 秒),因此很容易指定一个范围,包括您不想要的时间或遗漏的时间.

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

我更愿意:

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

? 映射到哪里:

  1. 目标日期的午夜。
  2. 目标日期之后的午夜。
  3. 目标日期的午夜。
  4. 目标日期之后的午夜。

它没有那么短,但绝对更安全,除非你真的想精确地指定你的间隔。

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

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

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

这也是为什么简短或简洁不能很好地衡量代码质量的一个例子。通常,我会这样排序:

  1. 准确性。
  2. 表现。
  3. 可读性/可维护性。
  4. 简洁。

关于sql - 这个sql语句可以缩短吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28286289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com