【问题标题】:mysql date ranges with larger date before smaller datemysql日期范围在较小日期之前具有较大日期
【发布时间】:2017-11-19 14:02:22
【问题描述】:

我想存储日期范围以允许营业时间以日期范围为条件以适应季节性变化。我正在使用以下条件

date_start < CURDATE() AND date_end > CURDATE()

问题在于,如果开始日期(9 月)大于结束日期(6 月)

在我的数据库中,我将日期(2017-07-01)存储为日期,但年份无关紧要(我什至不给用户机会在输入中选择年份)。我只是将其存储为用于验证目的的日期(如果有更好的方法我准备好了)。在上面的示例中,范围是在上一年的 9 月到今年的 6 月之间。我如何在不依赖年份的情况下适应这一点。请记住,日期范围可能只是同一年的一月到二月,所以我需要灵活性。

我想我可以将日期转换为数学数字并查看这些值是否大于或等于,但这似乎有点开销。

我可以查询数据库以确定当前日期在正确的开始日期和结束日期之间的有效方法是什么?

【问题讨论】:

  • 使用案例陈述
  • 条件在连接语句上

标签: mysql database date


【解决方案1】:

啊哈!

根据您测试哪个日期实际上早于另一个日期的想法,我们呈现了以下条件

( date_start < date_end AND date_start < CURDATE() AND date_end > CURDATE() ) OR ( date_start > date_end AND (date_start > CURDATE() AND CURDATE() < date_end) )

但是,这会考虑不需要的年份

然后我想,如果我们格式化每个 curdate 以有效地删除年份,例如

DATE_FORMAT(CURDATE(), '0000-%m-%d') 

然后,我将用上述内容替换每个 curdate(假设我将数据库中的日期存储为 0000-mm-dd)。我不喜欢这样,因为我一次又一次地重新计算相同的数字。我想也许我可以存储一个带有金额的别名,但在连接语句中我不能这样做。因此我的解决方案是 php 和 mysql 占位符的组合。

我用 php 找出当前日期一次并在占位符中使用它

$data = date('0000-m-d', time );

我将原始语句中的条件调整为 ( date_start :c ) OR ( date_start > date_end AND (date_start > :c AND :c

并将变量 $date 添加到我的 sql 数组和宾果游戏!

【讨论】:

    【解决方案2】:
    (date_start < date_end AND date_start < CURDATE() AND date_end > CURDATE()) OR (date_start > date_end AND (date_start > CURDATE() OR CURDATE() < date_end))
    

    这可能有帮助

    【讨论】:

    • 如果我将日期存储为 0000-06-17 或 2017-06-17 并从 curdate() 生成一年,如果最终无法正常工作,那么问题将是年份curdate() 总是会变大
    • 我喜欢它的开头。我什至没有考虑测试我存储的日期中哪个更大,然后根据它调整条件。
    • 您可以将 yearfixed - 例如 2017。将 2017 存储在数据库中,不要使用 CURDATE() - 而是使用基于 2017 的“当前日期”。或者,也许,您可以更改存储日期的方式range - 仅存储月份和日期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多