SQL 查询日期范围保存在 2 列中

Posted

技术标签:

【中文标题】SQL 查询日期范围保存在 2 列中【英文标题】:SQL query date range saved in 2 columns 【发布时间】:2021-08-15 15:50:13 【问题描述】:

我有一个包含多条记录的表(Hire Rates)。我正在尝试根据日期查询查找记录,但无法使其正常工作。

基本上我正在寻找包含两个日期之间的日期的记录。如果我的查询日期是“2021-08-15”,它应该返回第三行(3000),因为查询日期介于两个日期之间。

它主要对我有用,除非查询日期等于开始日期或结束日期 - 在这种情况下,它不会返回任何结果。

表格

startDate endDate hireRate
2021-01-01 2021-03-05 2350
2021-03-06 2021-04-08 2890
2021-04-09 2021-09-15 3000

查询

$sql = "SELECT rate, currencyID FROM hire_rates WHERE status = '1' AND NOT (startDate >= '$queryDate' OR endDate <= '$queryDate')

【问题讨论】:

如果您要查找包含两个日期之间的日期的记录,那么为什么在查询中使用 NOT? 【参考方案1】:

尝试添加“介于”条件。 像 select rate, currencyId from hire_rates where states =1 and not (cast($queryDate as DATE) between cast(startDate As DATE) and cast(endDate AS DATE) )

【讨论】:

【参考方案2】:

您将传递您关心的日期作为参数。然后你可以使用between(根据你对逻辑的描述):

SELECT rate, currencyID
FROM hire_rates
WHERE status = 1 AND
      ? BETWEEN startDate AND endDate;

其中? 是您传入的日期的参数。

对于 2021-08-15,你可以写:

WHERE status = 1 AND
      '2021-08-15' BETWEEN startDate AND endDate;

如果你想要当前日期,实际上可以从数据库中获取:

SELECT rate, currencyID
FROM hire_rates
WHERE status = 1 AND
      curdate() BETWEEN startDate AND endDate;

【讨论】:

当我尝试这个时,我无法让它工作。所以我已经完成了: SELECT rate, currencyID FROM hide_rates WHERE status = 1 AND startDate BETWEEN '2021-08-15' AND '2021-08-15' 但它没有返回我所期望的。顺便说一句,我只是以今天的日期为例——它将基于历史日期。【参考方案3】:

然后试试这个,`$sql = SELECT hireRate FROM hide_rate WHERE startDate= '$queryDate'

【讨论】:

以上是关于SQL 查询日期范围保存在 2 列中的主要内容,如果未能解决你的问题,请参考以下文章

SQL 如何查询日期在一定范围内的数据

优化数据库中大表的查询(SQL)

SQL 使用日期范围从另一个表返回数据以放入列中

SQL选择所有日期范围都存在的特定列

获取日期范围与列中最小日期之间的所有行

Oracle SQL 多列与单个范围/图例对齐