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