【问题标题】:How to limit recordset to dates in the past如何将记录集限制为过去的日期
【发布时间】:2013-09-16 20:35:03
【问题描述】:

第二次尝试这个,我就是不明白。

我想删除毕业日期已过的毕业生 vs $today 所以我想将记录集限制为仅那些在数据库中的日期是过去的学生。

我的表将 gradMonth 和 gradYear 存储为 varchar,即 2013 年 6 月。

所以,$today = strtotime(date("Y-F"))。这可以按预期工作并产生 1378008000。

我想连接 gradMonth,gradYear 的表字段值并将它们与$today 进行比较。 所以我的查询是:

SELECT 
    gradYear, gradMonth 
FROM 
    myTable 
WHERE 
    UNIX_TIMESTAMP(CONCAT_WS('-', gradYear, gradMonth, '01')) < '$today'

奇怪的是,这始终包括 2014 年 10 月和其他不小于 $today 的月份的记录,我不知道为什么。

感谢您提供的任何想法或帮助。

【问题讨论】:

  • 感谢您的可读编辑。
  • 如果有一个原生的DATE 列,MySQL 会更快乐。您在此处的此查询无法被索引,并且每次都需要行扫描,这对于非平凡数据集来说非常缓慢。
  • tadman - 数据库设置为 DATE 列的 YYYY-MM-DD,我们不要求特定的毕业日期,只要求月份和年份。如果我必须改变这一点,现在是时候这样做了,但我的观点有意义吗?这只是一个管理页面,不适用于外部用户。
  • 好吧,随便选一个日期,比如1,或者如果你只关心月份和年份,就足够接近了。拥有单独的列几乎总是很烦人,尤其是因为 MySQL 可以对本地列进行计算和验证,这对于两个原本不相关的整数来说并不容易。

标签: mysql unix-timestamp strtotime concat-ws


【解决方案1】:

更 MySQL 原生的方法:

WHERE DATE(CONCAT_WS('-', gradYear, gradMonth, '01')) < ?

为该占位符提供strtotime(date("Y-m-d") 参数。

如果您将 gradYeargradMonth 转换为正确的 DATE 列,则此查询将如下所示:

WHERE gradDate < ?

我不确定 "Y-F" 作为一种格式是如何工作的,因为它会产生像 "2013-January" 这样无法正确排序的东西,因为 "April" 将是一年中的第一个月 ASCII-abetically说话。

【讨论】:

  • Y-F in strtotime 于 2013 年至 9 月制作。好的,我将听取您的建议,转换为 DATE 并进行一些调整。当我让它工作时,我会回复你并给予信任。谢谢你的帮助。我会与您联系,(尤其是如果它不起作用:-))
  • 通常英文日期名称是个坏主意。 ISO 8601 format 是首选方式。
【解决方案2】:

你可以这样做:

SELECT gradYear, gradMonth FROM myTable WHERE date_format(CONCAT(gradYear,'-',gradMonth,'-01 00:00:00'),'%Y-%m') < date_format(CURRENT_TIMESTAMP(),'%Y-%m')

【讨论】:

  • 结果为零,但应该有一些。
  • 比较格式化日期和格式化日期可能是个坏主意。您需要的是转换为日期。
  • @mino - 感谢您的意见。它看起来不错,但我无法让它正确飞行。这对我来说是最奇怪的之一。
猜你喜欢
  • 2011-07-29
  • 1970-01-01
  • 2017-10-23
  • 2022-07-06
  • 1970-01-01
  • 2014-08-18
  • 2017-10-02
  • 1970-01-01
  • 2021-11-26
相关资源
最近更新 更多