Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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
Php 日期范围查询忽略跨越年终和年初的月份_Php_Mysql_Sql_Date - Fatal编程技术网

Php 日期范围查询忽略跨越年终和年初的月份

Php 日期范围查询忽略跨越年终和年初的月份,php,mysql,sql,date,Php,Mysql,Sql,Date,我需要构造一个日期范围查询来查找事件。 有些事件每年都会重复(yearly_natural=true),这会在年底/年初造成问题。我需要知道如何存储这些日期(我对年份使用什么值?)和/或改进查询。 我目前将重复日期存储为2017年的日期类型(或2017年和2018年,如果它们跨越新年) 这就是我尝试过的。它在新年期间的活动中起作用。此问题仅包括相关字段。 我很高兴重新设计数据库,因为我只有少量的测试数据 "SELECT event.event_name, event.start_date, ev

我需要构造一个日期范围查询来查找事件。 有些事件每年都会重复(yearly_natural=true),这会在年底/年初造成问题。我需要知道如何存储这些日期(我对年份使用什么值?)和/或改进查询。 我目前将重复日期存储为2017年的日期类型(或2017年和2018年,如果它们跨越新年) 这就是我尝试过的。它在新年期间的活动中起作用。此问题仅包括相关字段。 我很高兴重新设计数据库,因为我只有少量的测试数据

"SELECT event.event_name, event.start_date, event.end_date, event.all_year, event.yearly_natural 
      FROM event
      INNER JOIN event_location ON event_location.event_location_id = event.event_location_id
      WHERE 

      (event.yearly_natural = false

      AND
            (event.start_date BETWEEN '$testFrom' AND '$testTo') 
            OR (event.end_date BETWEEN '$testFrom' AND '$testTo') 
            OR (event.start_date <= '$testFrom' AND event.end_date >= '$testTo')
           )    
      OR (event.yearly_natural = true
      AND 
          (DATE_FORMAT(event.start_date, '%m%d') BETWEEN '$testFrom' AND '$testTo')
          OR  (DATE_FORMAT(event.end_date, '%m%d') BETWEEN '$testFrom' AND '$testTo')
          OR (DATE_FORMAT(event.start_date, '%m%d') <= '$testFrom' AND event.end_date >= '$testTo')
          )  

      OR (event.all_year = true)

          ";
“选择event.event\u name、event.start\u date、event.end\u date、event.all\u year、event.year\u natural”
从事件
事件位置上的内部联接事件位置。事件位置\u id=事件。事件位置\u id
哪里
(event.annual_natural=false
及
(event.start_日期介于“$testFrom”和“$testTo”之间)
或(event.end_日期介于“$testFrom”和“$testTo”之间)
或(event.start_date='$testTo')
)    
或(event.annual_natural=true)
及
(日期格式(event.start_DATE,“%m%d”)介于“$testFrom”和“$testTo”之间)
或(介于“$testFrom”和“$testTo”之间的日期格式(event.end_DATE,“%m%d”)
或(日期格式(event.start_DATE,'%m%d')='$testTo')
)  
或(event.all_year=true)
";

我同意KIKO软件的评论。每次事件发生一个条目可能更有意义。然而,如果你想保持现有的状态,你可以这样做。其概念是修改年份输入日期以匹配存储日期的年份,然后将其作为整个日期进行比较,而不仅仅是月份和日期。不确定它是否能100%正常工作,或者是否需要一些调整,但你应该能够从这里得到一些工作

     (event.yearly_natural = false

  AND
        (event.start_date BETWEEN '$testFrom' AND '$testTo') 
        OR (event.end_date BETWEEN '$testFrom' AND '$testTo') 
        OR (event.start_date <= '$testFrom' AND event.end_date >= '$testTo')
       )    
  OR (event.yearly_natural = true
  AND 
      (event.start_date BETWEEN CONCAT(DATE_FORMAT(event.start_date, '%Y'), '-', DATE_FORMAT('$testFrom', '%m-%d')) AND CONCAT(DATE_FORMAT(event.start_date, '%Y'), '-', DATE_FORMAT('$testTo', '%m-%d')))
    OR (event.end_date BETWEEN CONCAT(DATE_FORMAT(event.end_date, '%Y'), '-', DATE_FORMAT('$testFrom', '%m-%d')) AND CONCAT(DATE_FORMAT(event.end_date, '%Y'), '-', DATE_FORMAT('$testTo', '%m-%d')))
    OR (event.start_date <= CONCAT(DATE_FORMAT(event.start_date, '%Y'), '-', DATE_FORMAT('$testFrom', '%m-%d')) AND event.end_date >= CONCAT(DATE_FORMAT(event.end_date, '%Y'), '-', DATE_FORMAT('$testTo', '%m-%d'))
)  

  OR (event.all_year = true)
(event.annual\u natural=false
及
(event.start_日期介于“$testFrom”和“$testTo”之间)
或(event.end_日期介于“$testFrom”和“$testTo”之间)
或(event.start_date='$testTo')
)    
或(event.annual_natural=true)
及
(event.start_date介于CONCAT(date_格式(event.start_date,'%Y')、'-',date_格式('$testFrom','%m-%d'))和CONCAT(date_格式(event.start_date,'%Y')、'-',date_格式('$testTo','%m-%d'))之间)
或者(event.end_日期介于CONCAT(日期格式(event.end_日期,'%Y'),'-',日期格式('$testFrom','%m-%d'))和CONCAT(日期格式(event.end_日期,'%Y'),'-',日期格式('$testTo','%m-%d'))之间)
或者(event.start_date=CONCAT(日期格式(event.end_date,“%Y”),“-”,日期格式(“$testTo”,“%m-%d”))
)  
或(event.all_year=true)

我同意KIKO软件的评论。每次事件都有一个条目可能更有意义。但是,如果您想保持现有的方式,您可能可以这样做。其概念是修改年份输入日期以匹配存储日期的年份,然后将其作为整个日期进行比较,而不是仅进行比较月和日。不确定它是否会100%正常工作,或者是否需要一些调整,但你应该能够从这里得到一些工作

     (event.yearly_natural = false

  AND
        (event.start_date BETWEEN '$testFrom' AND '$testTo') 
        OR (event.end_date BETWEEN '$testFrom' AND '$testTo') 
        OR (event.start_date <= '$testFrom' AND event.end_date >= '$testTo')
       )    
  OR (event.yearly_natural = true
  AND 
      (event.start_date BETWEEN CONCAT(DATE_FORMAT(event.start_date, '%Y'), '-', DATE_FORMAT('$testFrom', '%m-%d')) AND CONCAT(DATE_FORMAT(event.start_date, '%Y'), '-', DATE_FORMAT('$testTo', '%m-%d')))
    OR (event.end_date BETWEEN CONCAT(DATE_FORMAT(event.end_date, '%Y'), '-', DATE_FORMAT('$testFrom', '%m-%d')) AND CONCAT(DATE_FORMAT(event.end_date, '%Y'), '-', DATE_FORMAT('$testTo', '%m-%d')))
    OR (event.start_date <= CONCAT(DATE_FORMAT(event.start_date, '%Y'), '-', DATE_FORMAT('$testFrom', '%m-%d')) AND event.end_date >= CONCAT(DATE_FORMAT(event.end_date, '%Y'), '-', DATE_FORMAT('$testTo', '%m-%d'))
)  

  OR (event.all_year = true)
(event.annual\u natural=false
及
(event.start_日期介于“$testFrom”和“$testTo”之间)
或(event.end_日期介于“$testFrom”和“$testTo”之间)
或(event.start_date='$testTo')
)    
或(event.annual_natural=true)
及
(event.start_date介于CONCAT(date_格式(event.start_date,'%Y')、'-',date_格式('$testFrom','%m-%d'))和CONCAT(date_格式(event.start_date,'%Y')、'-',date_格式('$testTo','%m-%d'))之间)
或者(event.end_日期介于CONCAT(日期格式(event.end_日期,'%Y'),'-',日期格式('$testFrom','%m-%d'))和CONCAT(日期格式(event.end_日期,'%Y'),'-',日期格式('$testTo','%m-%d'))之间)
或者(event.start_date=CONCAT(日期格式(event.end_date,“%Y”),“-”,日期格式(“$testTo”,“%m-%d”))
)  
或(event.all_year=true)

您只需选择一个任意日期,比如说1月1日,并将其赋值为0。1月5日为4,明年1月3日为367,依此类推。与Linux时间戳的作用类似,我们将其称为“daystamp”。请注意,这些daystamp与时间戳一样是相对的,而不是绝对的。唯一的一点是你需要做的是从实际日期到这些日期戳的转换例程

function daystamp2timestamp($daystamp)
// returns a timestamp of the daystamp
{
  $startThisYear = strtotime(date('Y').'-01-01 12:00');
  return strtotime("+$daystamp day",$startThisYear);
} 

function timestamp2daystamp($timestamp)
// returns a daystamp of the timestamp 
{
  $startThisYear = strtotime(date('Y').'-01-01 12:00');
  return floor(($timestamp-$startThisYear)/(24*60*60));
} 
此代码未经测试,因此请在使用前对其进行测试。它只是给您一个想法。您可能知道,
timestamp
可以使用
date()
函数轻松地转换为日期


您只需在数据库中存储DayStamp,使用它可以轻松查看事件是否在日期范围内。首先将日期转换为DayStamp,并将其与数据库中的值进行比较。

您只需选择一个任意日期,例如1月1日,然后将其值指定为0。1月5日为4日,1月3日为3日明年1月将是367,以此类推。与Linux时间戳类似,我们将其称为“daystamp”。请注意,这些daystamp与时间戳是相对的,而不是绝对的。您需要做的唯一一件事是将实际日期转换为这些daystamp的例程。我将在PHP中执行此操作:

function daystamp2timestamp($daystamp)
// returns a timestamp of the daystamp
{
  $startThisYear = strtotime(date('Y').'-01-01 12:00');
  return strtotime("+$daystamp day",$startThisYear);
} 

function timestamp2daystamp($timestamp)
// returns a daystamp of the timestamp 
{
  $startThisYear = strtotime(date('Y').'-01-01 12:00');
  return floor(($timestamp-$startThisYear)/(24*60*60));
} 
此代码未经测试,因此请在使用前对其进行测试。它只是给您一个想法。您可能知道,
timestamp
可以使用
date()
函数轻松地转换为日期


您只需要在数据库中存储DayStamp,使用它们可以很容易地查看事件是否在日期范围内。首先将日期转换为DayStamp,并将其与数据库中的值进行比较。

奇怪。我认为事件不太可能在每年的同一日期开始和结束,并且发生在同一地点。我