Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 日期是否在某些时段内_Mysql_Sql - Fatal编程技术网

Mysql 日期是否在某些时段内

Mysql 日期是否在某些时段内,mysql,sql,Mysql,Sql,我有下表的项目及其活动周期(周期定义为起始日期和截止日期): 当然,一个项目可以有任意数量的活动周期 我需要一个SQL查询(函数),如果给定的项目在某个给定的日期(在某些项目的活动期内的给定日期)处于活动状态,该查询将返回true/false 此函数应该执行您想要的操作。它依赖于MySQL在数字上下文中将布尔结果处理为1或0,因此MAX调用实际上成为所有条件的或 CREATE FUNCTION check_activity(project_id INT, check_date DATE) RET

我有下表的项目及其活动周期(周期定义为起始日期和截止日期):

当然,一个项目可以有任意数量的活动周期


我需要一个SQL查询(函数),如果给定的项目在某个给定的日期(在某些项目的活动期内的给定日期)处于活动状态,该查询将返回true/false

此函数应该执行您想要的操作。它依赖于MySQL在数字上下文中将布尔结果处理为1或0,因此
MAX
调用实际上成为所有条件的

CREATE FUNCTION check_activity(project_id INT, check_date DATE)
RETURNS BOOLEAN
DETERMINISTIC
BEGIN
  RETURN (SELECT MAX(check_date BETWEEN ActiveFrom AND ActiveTo) FROM projects WHERE ProjId = project_id);
END
SELECT check_activity(20, '2018-01-10'), check_activity(20, '2018-02-01')
输出

check_activity(20, '2018-01-10')    check_activity(20, '2018-02-01')
1                                   0

太好了!到目前为止你做了什么?提示:
WHERE
和一些日期比较。是的,我尝试了一些方法,但是我遇到了任意周期数的问题。如果周期数已知,那么就很简单了,但是如何在未知的周期数内进行检查。提示:
选择CASE COUNT(*)当>0时,则为TRUE,否则为FALSE,来自项目,其中“2018-11-21”介于(ActiveFrom,ActiveTo)之间。
谢谢@AntonyGibbs这很好提示:选择COUNT(*)从projId=20和ActiveFrom和ActiveTo之间的'2018-01-21'的项目来看,就是这样,我不习惯在SELECT中使用BEVER作为逻辑测试(我总是在WHERE子句中使用它)。伙计们对我的问题做了负面评价,虽然它不像看上去那么简单。@sbrbot同意,未知的周期数确实让问题变得更复杂。MySQL将布尔值视为整数,这一事实使得我们可以提出一个相对简单的解决方案,而不必遍历所有周期。请注意,由于它最终是一个单行程序,您可能不需要将其包含在函数中。确切地说,如果请求的日期至少在一个期间内(如果没有重叠,则只存在一个1,但未指定非重叠期间),则@Nick使用MAX返回1。我还想避免在函数中循环使用句点,这就是为什么我更改了那个需要查询的函数(然后是函数)。然而,我认为男人们低估了这个问题。
check_activity(20, '2018-01-10')    check_activity(20, '2018-02-01')
1                                   0