MySQL查询:查询所有超过1年的条目
我正在为LibreOffice的一个非营利慈善机构建立一个会员数据库,但没有mysql查询方面的经验,因此我非常感谢您的帮助MySQL查询:查询所有超过1年的条目,mysql,Mysql,我正在为LibreOffice的一个非营利慈善机构建立一个会员数据库,但没有mysql查询方面的经验,因此我非常感谢您的帮助 我正在尝试创建一个查询,以显示会员注册日期字段(PaymentDate)早于当前日期1年的所有记录,并且另一个字段(WaitingRenewal)的布尔值为否。日期为05/03/85格式。谢谢你能给我的任何帮助 您可以执行以下操作: select * from `members` where `paymentDate` < DATE_SUB(CURDATE()
我正在尝试创建一个查询,以显示会员注册日期字段(PaymentDate)早于当前日期1年的所有记录,并且另一个字段(WaitingRenewal)的布尔值为否。日期为05/03/85格式。谢谢你能给我的任何帮助 您可以执行以下操作:
select * from `members`
where `paymentDate` < DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
and `AwaitingRenewal` = 'NO'
从'members'中选择*
其中,`paymentDate`
我的注意力被吸引到这个问题上,因为另一个类似的问题结束了,并引用这个问题作为重复。但我觉得这些答案并没有完全解决这两个问题,所以我想补充一点,我觉得我遗漏了一点
DATE
或DATETIME
列尚未包含时区信息。当调用MySQLCURDATE
或NOW
函数分别获取当前日期或日期和时间时,返回的值始终与当前有效的会话时区有关。所以我们不得不问,最初的列值是如何设置的?是通过调用CURDATE
还是NOW
来实现的?如果是,那么当时生效的会话时区是否与现在生效的相同?或者,如果该列已设置了一个文本,如'2020-03-01'
或'2020-03-01 03:00:00'
,则设置者在创建该文本时考虑了哪个隐含时区?同样,它是为当前会话设置的同一时区吗
只有将当前会话时区设置为与当前日期或日期和时间比较的列显式或隐式生效的同一时区,MySQL函数date\u SUB
才会给出正确的结果(或者,如果您知道这两个时区之间的小时差异,则可以根据该差异调整DATE\u SUB
返回的结果)
因此,如果您需要存储日期-时间信息,稍后您将询问诸如此日期-时间是否发生在一年前之类的问题,DATEIME
列是一个糟糕的数据类型选择,因为它不包含时区信息。此列类型是否已被初始化为CURDATE()
或NOW()
,则数据在内部会有效(尽管不准确)转换为UTC时间,因此会有一个隐含的UTC时区。随后,当将列与CURDATE()
或NOW()进行比较时
或与诸如DATE\u SUB
之类的功能一起使用,它将自动转换回会话有效的当前时区,您将获得正确的结果
然而,在这个特定的示例中,我们处理的是DATE
列当时使用的默认会话时区是美国/洛杉矶“
。一段时间后,您移动到了另一台服务器,现在默认会话时区是“美国/纽约”
。如果您真的关心3小时的差异并希望尽可能准确(并且假设您意识到时区发生了这种变化),那么您需要设置正确的会话时区,以解释日期
列:
set session time_zone = 'America/Los_Angeles';
select * from `members`
where `paymentDate` < DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
and `AwaitingRenewal` = 'NO'
然后,只要将paymentDate
列与包含时区信息的值(如CURDATE()
或NOW()返回的值)进行比较,就不必担心当前会话的时区
。但是您现在可能必须对列使用DATE
函数来抑制包含时间分量的结果,即使它是00:00:00
:
select * from `members`
where DATE(`paymentDate`) < DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
and `AwaitingRenewal` = 'NO'
从'members'中选择*
其中日期(`paymentDate`)小于日期(CURDATE(),间隔1年)
和“等待更新”=“否”
但是如果进行此转换,还有一件事需要注意。
TIMESTAMP
列(pyamentDate
)将通过将内部值转换为当前会话时区来显示,而原始DATE
列的显示完全独立于当前会话时区。“无法加载数据:在语句中找不到表。”"我仔细检查了所有的表名和列名,它们都是正确的。您可能必须将表名和字段名放在引号中。您知道您试图询问的数据库的名称吗。这是一条有效的SQL语句。您可能必须使用name\u of_db.members
而不是members。如果这样做,我会得到一个无效的架构名错误。这是如果有人能看到我做错了什么,我会非常感激……这也是我学习的最好方式。
set session time_zone = 'America/Los_Angeles';
alter table `members` change `paymentDate` `paymentDate` timestamp not null;
select * from `members`
where DATE(`paymentDate`) < DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
and `AwaitingRenewal` = 'NO'