我有一个显示广告系列中广告的应用.我将每个广告系列的广告集的显示限制为每个广告系列的特定日期范围.我的“广告系列”表如下所示:
campaigns
id : integer
start_date : date
end_date : date
现在,我需要能够选择每天将广告系列广告的显示限制为特定时间范围.所以现在我的桌子看起来像
campaigns
id : integer
start_date : date
end_date : date
start_time : time, default: null
end_time : time, default: null
因此,我的[MySQL]查询如下所示:
SELECT
ads.*
FROM
ads
INNER JOIN campaigns ON campaigns.id = ads.campaign_id
WHERE
campaigns.start_date <= "2014-08-05" AND
campaigns.end_date >= "2014-08-05" AND
campaigns.start_time <= "13:30"
campaigns.end_time >= "13:30";
(日期和时间实际上是使用当前日期/时间注入的.)
这很好.但是,因为我以UTC时间存储start_time和end_time,所以有时end_time早于start_time.例如,在数据库中:
start_time = 13:00 (08:00 CDT)
end_time = 01:00 (20:00 CDT)
如何调整查询(甚至使用代码)以解决此问题?
解决方法:
这个问题比看起来要难,因为广告系列或比较时间跨度都可能超出日期范围.然后,还有另外的并发症.如果广告系列说它一直运行到凌晨1:00,那么结束日期是当前日期还是下一个日期?换句话说,以您的示例为例,在2014-08-06上午1:00应该算作2014-08-05.
因此,我的建议是切换到本地时间.如果您的广告系列没有持续到午夜,那么这应该可以解决您的问题.
如果您只关心午夜的广告系列本身,则可以执行以下操作:
WHERE campaigns.start_date <= '2014-08-05' AND
campaigns.end_date >= '2014-08-05' AND
((campaigns.start_time <= campaigns.end_time and
campaigns.start_time >= '13:00' and
campaigns.end_time <= '18:00'
) or
(campaigns.start_time >= campaigns.end_time and
(campaigns.start_time >= '13:00' or
campaigns.end_time <= '18:00'
)
)
请注意,当end_time大于开始时间时,则希望时间大于开始时间或小于结束时间.在正常情况下,您希望时间大于开始时间而小于结束时间.
如果您只关心比较时间段,则可以执行类似的操作.将两者结合起来似乎很复杂.
标签:utc,sql,mysql 来源: https://codeday.me/bug/20191029/1958770.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。