MySQL查询:查询超过1年的所有条目

时间:2012-10-04 21:16:58

标签: mysql libreoffice

我正在为LibreOffice的非盈利慈善机构组建一个会员数据库,但是没有mysql查询的经验,所以我很感激帮助。

我正在尝试创建一个查询,显示所有记录,其中成员资格注册日期字段( PaymentDate )早于当前日期的1年 AND 一个布尔值另一个字段( AwaitingRenewal )是NO。日期为 05/03/85 格式。谢谢你能给我的任何帮助!

4 个答案:

答案 0 :(得分:5)

您可以执行以下操作:

select * from `members` 
  where `paymentDate` < DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
  and `AwaitingRenewal` = 'NO'

答案 1 :(得分:1)

* from dt_tb where `dt` >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR)

答案 2 :(得分:0)

解决:需要更旧的mysql语法。

答案 3 :(得分:0)

我注意到这个问题是因为另一个类似的问题被关闭,引用这个问题作为重复。但我不认为这些答案中的任何一个都完全解决了这两个问题,所以我想补充一点我觉得缺失的点。

当调用 MySQL DATEDATETIME 函数分别获取当前日期或日期和时间时,CURDATENOW 列尚未携带时区信息,返回的值始终与当前有效的会话时区相关。因此,必须问原始列值是如何设置的?是否调用了 CURDATENOW,如果是,那么当时有效的会话时区是否与现在有效的时区相同?或者,如果该列已设置为文字,例如 '2020-03-01''2020-03-01 03:00:00',那么在创建该文字时,setter 考虑的是什么隐式时区?再说一次,它是否与为当前会话设置的时区相同?

仅当当前会话时区设置为与当前日期或日期和时间进行比较的列时显式或隐式生效的相同时区,MySQL 函数 {{1} } 将为您提供正确的结果(或者,如果您知道这两个时区之间的小时数差异,则可以根据该差异调整 DATE_SUB 返回的结果)。

因此,如果您需要存储日期时间信息,然后您会询问诸如此日期时间是否发生在一年多以前的问题,那么 DATE_SUB 列是一种糟糕的数据类型选择只是因为它没有携带时区信息。如果将此列类型改为将 DATEIME 初始化为 TIMESTAMPCURDATE(),那么在内部数据将有效(尽管不完全)转换为 UTC时间,因此将具有隐式 UTC 时区。随后,当该列与 NOW()CURDATE() 进行比较或与 NOW() 等函数一起使用时,它将自动转换回对会话有效的当前时区,并且你会得到正确的结果。

但是,在此特定示例中,我们处理的是 DATE_SUB 列。假设它是用 DATE 初始化的,并且当时正在使用默认会话时区,即 CURDATE()。一段时间后,您移到了不同​​的服务器,现在当前的默认会话时区是 America/Los_Angeles'。如果您真的关心 3 小时的差异并希望尽可能准确(假设您意识到时区发生了这种变化),那么您需要设置正确的会话时区,'America/New_York'应解释列:

DATE

或者一劳永逸,您可以通过将 set session time_zone = 'America/Los_Angeles'; select * from `members` where `paymentDate` < DATE_SUB(CURDATE(), INTERVAL 1 YEAR) and `AwaitingRenewal` = 'NO' 列转换为 paymentDate 列来“修复”您的数据库(即使您将只存储 TIMESTAMP 值,这将具有隐式 CURDATE() 时间值)与:

00:00:00

然后您就不必担心当前会话时区是什么,只要您将 set session time_zone = 'America/Los_Angeles'; alter table `members` change `paymentDate` `paymentDate` timestamp not null; 列与具有时区信息的值(例如 paymentDate 返回的值)进行比较或CURDATE()。但是您现在可能必须对列使用 NOW() 函数来抑制具有时间分量的结果,即使它是 DATE

00:00:00

但是,如果您进行这种转换,还有一件事需要注意。 select * from `members` where DATE(`paymentDate`) < DATE_SUB(CURDATE(), INTERVAL 1 YEAR) and `AwaitingRenewal` = 'NO' 列 (TIMESTAMP) 将通过将内部值转换为当前会话时区来显示,而原始 pyamentDate 列的显示完全独立于当前会话时区。< /p>