使用datetime和php从1天,7天和30天前选择mysql db中的记录

mrp*_*atg 10 mysql sql datetime

我使用以下查询来定位比当前时间早X天的结果.

SELECT  *,
        DATE_FORMAT(datetime, '%m/%d/%Y') 
   FROM table 
  WHERE datetime BETWEEN SYSDATE() - INTERVAL 30 DAY 
                     AND SYSDATE() 
ORDER BY ID DESC
Run Code Online (Sandbox Code Playgroud)

问题是,从当天其返回的数据,如果从正好是30天前的记录犯规存在,以及不相关的数据

有更好的方法吗?

Bil*_*win 31

BETWEEN包括两个参数之间的所有值,包括每端的值.换句话说,BETWEEN 1 AND 4包括值1,2,3和4.不仅仅是1和4,而不仅仅是2和3.

如果您只想要30天前的单日日期,请尝试以下方法:

SELECT  *,
        DATE_FORMAT(datetime, '%m/%d/%Y') 
   FROM table 
  WHERE DATE(datetime) = CURDATE() - INTERVAL 30 DAY 
ORDER BY ID DESC
Run Code Online (Sandbox Code Playgroud)

使用CURDATE()而不是SYSDATE()因为CURDATE()返回没有时间组件的日期.

  • 如果你通过一个函数运行datetime列,那么使用CURDATE是没有用的 - 少了代码,但是如果在`datetime`列上存在索引,则不能使用索引. (2认同)

OMG*_*ies 12

您的查询设置为在今天(包括时间)和之前30天之间获取记录.

如果您想要超过30天(到时间)的记录,请使用:

  SELECT *,
         DATE_FORMAT(datetime, '%m/%d/%Y') 
    FROM table 
   WHERE datetime <= DATE_SUB(SYSDATE(), INTERVAL 30 DAY)
ORDER BY ID DESC
Run Code Online (Sandbox Code Playgroud)

如果你想要那些只有30天,而不是31或29,不考虑时间部分 - 使用:

  SELECT *,
         DATE_FORMAT(datetime, '%m/%d/%Y') 
    FROM table 
   WHERE DATE_FORMAT(datetime, '%m/%d/%Y') = DATE_FORMAT(DATE_SUB(SYSDATE(), INTERVAL 30 DAY), '%m/%d/%Y') 
ORDER BY ID DESC
Run Code Online (Sandbox Code Playgroud)