mysql sql查询中的日期逻辑

mysql sql查询中的日期逻辑,mysql,sql,datetime,Mysql,Sql,Datetime,嗨,我完全搞不懂mysql查询中的日期逻辑,因为cron作业每天早上12:00运行 我在一个汽车上市网站上工作,那里的汽车上市有一个mysql datetime格式的到期日 所有过期房源将在到期日起7天后从网站上删除 当cron作业运行时,它必须执行以下操作 任务1-向用户发送电子邮件警报,告知他们的列表已过期 因此,我需要选择自上次运行cron作业以来已过期的所有列表,并且在此之前不包括列表,以便每个列表只发送一次过期警报电子邮件 我尝试了执行此任务的sql查询(再次与此混淆) 从到期日>日期

嗨,我完全搞不懂mysql查询中的日期逻辑,因为cron作业每天早上12:00运行

我在一个汽车上市网站上工作,那里的汽车上市有一个mysql datetime格式的到期日

所有过期房源将在到期日起7天后从网站上删除

当cron作业运行时,它必须执行以下操作

任务1-向用户发送电子邮件警报,告知他们的列表已过期

因此,我需要选择自上次运行cron作业以来已过期的所有列表,并且在此之前不包括列表,以便每个列表只发送一次过期警报电子邮件

我尝试了执行此任务的sql查询(再次与此混淆)

从到期日>日期子项(现在(),间隔1天)和到期日<现在()的车辆中选择车辆id
任务2-将向用户发送电子邮件警报,告诉他们列表将在24小时后被永久删除

因此,我需要选择所有那些将在超过24小时/6天内被删除的列表,因为它们已经过期,我需要确保它们至少有24小时的时间来更新它们。此外,我需要选择/构建sql查询,以便只选择那些将在1天内到期的列表,而不是其他列表,以避免多个电子邮件警报而不是一次电子邮件警报

我尝试过为这个任务执行sql查询(我完全不明白这个查询)

从到期日>日期(现在(),间隔7天)和到期日<日期(现在(),间隔1天)的车辆中选择车辆id
任务3-删除7天前过期的所有列表

我尝试了以下sql查询来完成此任务

SELECT car_id FROM cars WHERE expiry_date < DATE_SUB(NOW(), INTERVAL 7 DAY)
从过期日期

请帮助我完善所有3个查询,以便cron完全按照我的要求完成它的工作。另外,请告诉我它必须在哪里>=(大于或等于)或您的查询没有明显错误,如果您不了解您所使用的函数,请搜索它们并阅读它们,直到您了解为止

在您的方法中有一个根本性的问题,即它依赖于cron作业以24小时间隔(毫秒)运行,否则会出现重复和/或遗漏

您需要另一个表来存储批处理程序上次运行的详细信息;用一行在过去很长一段时间的日期来初始化,这样我们就有了一个起点

您可以通过从BatchRecordTables
中选择MAX(date\u ran)来获取最近的批次。将其存储在局部变量T0中。获取当前时间,将其存储在局部变量T1中(不要在多个查询中使用NOW(),因为它们的时间略有不同,并且需要相同)。我不知道这是MySQL的语法-你必须查一下

然后,你的处境变得更糟

  • 向自上次运行cron作业以来列表已过期的人员发送电子邮件,即
    从过期日期介于T0和T1之间的车辆中选择车辆id
    。这将仅选择在此批和上一批之间已过期的人员
  • 对于第二种情况,我们需要知道这些人收到了第一封电子邮件,即他们的列表在最后一批运行之前已经过期,因此
    从过期日期介于日期(T1,间隔6天)和T0之间的车辆中选择车辆id。这将只选择在最后一批(即,他们收到了exprired电子邮件)之前和6天前过期的人
  • 同样的逻辑也适用-我们想知道他们收到了第二封电子邮件<代码>从到期日期介于日期(T1,间隔7天)和日期(T0,间隔6天)之间的车辆中选择车辆id

  • 我还建议您不要永久删除列表,而是将它们复制到DeletedListings表中,或者使用删除列标记它们-每个列表都有自己的优缺点。在信息时代,永远不要扔掉数据——你永远不知道数据什么时候可能有价值。

    查看这些查询

    select * from cars where datediff(EXPIRY_DATE,now())=-1;
    
    
    select * from cars where 
    datediff(DATE_ADD(EXPIRY_DATE, interval 24 hour),now())>=1 and
    datediff(DATE_ADD(EXPIRY_DATE, interval 24 hour),now()) <=2;
    
    
    
    select * from cars where datediff(expiry_date,now())<=-7;
    
    从车中选择*,其中datediff(expiration_DATE,now())=-1;
    从以下位置选择*
    datediff(DATE\u ADD(到期日,间隔24小时),now())>=1和
    
    datediff(DATE\u ADD(expiration\u DATE,interval 24小时),now())这就是您要找的吗?请尝试添加另一列以查看
    到期日
    当前日期时间
    之间的差异,以便更好地了解您处理的日期

    --第三次查询到期日期早于
    --今天
    选择车辆id、到期日、,
    日期(现在(),间隔7天)
    来自汽车
    
    如果到期日给我们一份表格数据样本,或者优先选择SQLFiddle@DaleM-我添加了phpmyadmin转储,作为一个新手,我仍然不知道如何保存和共享SQLFIDLEtrying@DaleM-我添加了sqlfiddle,请帮助我it@Asnexplore
    活动日程安排
    也会很好。。。要在中午12点或午夜12点触发..cognos可以执行这种查询吗?我已经创建了一个cron作业表,其中包含字段last_run_,用于存储cron上次运行的日期时间,但我需要知道如何将BatchRecordTables中的SELECT MAX(date_ran)存储在临时变量中,并在查询中使用它。你能帮我一下吗?@Asnexplore不是真的,我使用SQL Server,对MySQL语法不熟悉-你为什么不用谷歌搜索一下呢?没关系,不过我已经找到了,谢谢你的帮助
    SELECT car_id FROM cars WHERE expiry_date < DATE_SUB(NOW(), INTERVAL 7 DAY)
    
    select * from cars where datediff(EXPIRY_DATE,now())=-1;
    
    
    select * from cars where 
    datediff(DATE_ADD(EXPIRY_DATE, interval 24 hour),now())>=1 and
    datediff(DATE_ADD(EXPIRY_DATE, interval 24 hour),now()) <=2;
    
    
    
    select * from cars where datediff(expiry_date,now())<=-7;
    
    -- 3rd query expiry dates older than 7 days from 
    -- today
    
    SELECT car_id, expiry_Date, 
    DATE_sub(NOW(), INTERVAL 7 DAY)
    FROM cars 
    WHERE expiry_date <= 
    DATE_sub(NOW(), INTERVAL 7 DAY)
    ;
    
    -- same
    
    SELECT car_id, expiry_Date, 
    DATE_ADD(NOW(), INTERVAL -7 DAY)
    FROM cars 
    WHERE expiry_date <= 
    DATE_ADD(NOW(), INTERVAL -7 DAY)
    ;
    
    
    -- 2nd query going to expire in exactly 1 day
    
    SELECT car_id, expiry_date, 
    Now() + interval 1 day
    FROM cars 
    WHERE expiry_Date = Now() + interval 1 day
    ;
    
    -- 1st query: expired 
    
    SELECT car_id FROM cars 
    WHERE expiry_date < Now()
    ;
    
    -- 1st query: expired last 24 hours
    
    SELECT car_id,DATEDIFF(expiry_date, Now())
    FROM cars 
    WHERE expiry_Date < Now()
    AND expiry_Date >= Now() - interval 1 day
    ;