【问题标题】:MySQL - How do I get a range from the point closest to start?MySQL - 如何从最接近开始的点获取范围?
【发布时间】:2009-08-28 15:21:35
【问题描述】:

表结构-

int PrimaryKey
DateTime Date
int Price

我想做的是传入开始和结束日期,并获取范围

发件人

小于或等于开始的最大日期除非没有这样的日期,在这种情况下,范围的开始应该是可用的最小日期。

收件人

结束日期。

到目前为止我的查询是:

SELECT Date, Price
FROM table1
WHERE Date <= $end
AND Date >= 
(
  SELECT Date
  FROM table1
  WHERE Date <= $start
  ORDER BY Date DESC
  LIMIT 1
)

子查询获取小于或等于起始值的最大日期,然后将其用作主查询范围的下限。有什么关于在其中添加“UNLESS”子句的建议吗?

例如,给定一个带有日期的表格:

Jan 1, 2009
Feb 1, 2009
Mar 1, 2009
Apr 1, 2009

我希望使用$start='Feb 18, 2009'$end='Apr 30, 2009' 进行查询以返回2 月1 日、3 月1 日、4 月1 日的三行(2009 年2 月1 日是小于或等于$start 的最大日期)。

但如果我提供 $start='Dec 1, 2009'$end='Apr 30, 2009' 我希望返回所有四行(没有小于或等于 $start 的日期,因此范围从最低日期开始)

【问题讨论】:

    标签: mysql select


    【解决方案1】:

    您不需要“除非没有这样的日期,在这种情况下,范围的开始应该是可用的最低日期”逻辑,因为如果您只是选择 $start 之后的所有日期如果没有上一个日期,无论如何您都会自动获得下一个最晚日期。并且您已经知道 $start 和下一个最晚日期之间没有记录,所以不要费心尝试排除它们!

    WHERE Date BETWEEN coalesce((select max(date)
                                   from table1
                                  where date <= $start)
                                , $start) and $end
    

    【讨论】:

    • 现在测试一下,coalesce 看起来确实是我需要的。
    • 一旦我停止将日期作为整数传递,工作就像做梦一样>。
    【解决方案2】:

    您为什么不将它与 $start 日期进行比较?

    SELECT Date, Price
    FROM table1
    WHERE Date <= $end
    AND Date >=$start
    

    我还没有测试过,但它似乎对我有用(如果我明白你想要做什么的话)

    【讨论】:

    • 如果没有确切的开始日期,这并没有捕捉到我希望范围开始 /before/ $start 参数。我将使用一些预期行为示例来编辑我的原件。
    猜你喜欢
    • 1970-01-01
    • 2020-12-25
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2022-12-18
    • 2012-04-01
    相关资源
    最近更新 更多