按日期过滤记录以检索最近7天

时间:2019-06-24 18:52:14

标签: mysql

我对SQL有点陌生,正在尝试创建一个查询,如果它与多个参数匹配,该查询将对一个条目进行计数。其中之一是必须在最近7天内输入,其余查询参数运行良好,但是我添加了打破日期范围的AND。有人可以协助吗?这是我的查询,日期字段为pvs.last_reading,格式为2019-06-24 16:20:00。

composer require Bm/ah-contentelements:"@dev"

2 个答案:

答案 0 :(得分:0)

这是日期时间边界问题。 SQL是正确的。根据我们在评论中的对话,您希望看到的数据行的日期时间为:

2019-06-24 16:20:00

但是根据您前一个星期的查询,服务器上的日期时间(截至撰写本文时)更接近:

2019-06-24 12:50:20

因此,NOW()patient_vitals_state.last_reading值之前 ,而SQL实际上正在按照预期的方式运行:它排除了{{1} }在last_reading参数之外。

您发布的结果中的BETWEEN Z告诉我,主要是MySQL服务器将日期时间存储在UTC中,但是您希望将预期结果基于自己的本地时间。可能您也使用自己的本地时间输入时间,但是在不知不觉中它们被存储在UTC中的情况下,因此表示的时间点与您的实际意图不同。

时区问题是处理日期和时间时非常常见的一类问题。数据库列使用的时区是此一般问题的一个特定方面。

要解决此问题,您需要同步如何将日期时间数据输入数据库,从数据库中存储和从数据库中获取数据。关于此主题,有很多文章可供阅读-无法在SO答案中发布。但是希望这可以解释问题的根源,并引导您阅读需要理解的基本问题。

答案 1 :(得分:0)

一种可能的解决方案:

SELECT  count(*) as criticalCases
  FROM patient_vitals_state pvs
   JOIN user u 
    on u.uuid = pvs.patient_uuid
  WHERE EXISTS (
    SELECT pc.clinic_uuid 
     FROM patient_clinics pc
      WHERE pc.clinic_uuid IN (?) 
    AND pc.patient_uuid = u.uuid
    )
  AND pvs.avg_sbp >= 181
  AND pvs.last_reading BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) 
    AND DATE_ADD(NOW(), INTERVAL 1 DAY);