Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.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 MySQL-在查询中转换和比较日期_Php_Mysql_Date - Fatal编程技术网

Php MySQL-在查询中转换和比较日期

Php MySQL-在查询中转换和比较日期,php,mysql,date,Php,Mysql,Date,我在一个足球网站上工作,它有很多功能,列出结果表。这些表格在季节(季节名称等)和轮次(每次新的季节开始时生成,如2008/2009、2009/2010等)之间分开 轮次表有一个开始日期和一个结束日期,我必须通过将这些日期与同一赛季的剩余轮次进行比较,才能真正了解我应该在网站前端使用哪一轮轮次 所有数据都是从xml中提取的,日期如下所示: 2009-08-16 因此,我有两个问题: 比较日期(可能会即时转换),找出女巫回合的结束日期最大 获得正确的回合(未来的一些回合可能已经在数据库中,但当前

我在一个足球网站上工作,它有很多功能,列出结果表。这些表格在季节(季节名称等)和轮次(每次新的季节开始时生成,如2008/2009、2009/2010等)之间分开

轮次表有一个开始日期和一个结束日期,我必须通过将这些日期与同一赛季的剩余轮次进行比较,才能真正了解我应该在网站前端使用哪一轮轮次

所有数据都是从xml中提取的,日期如下所示:

2009-08-16
因此,我有两个问题:

  • 比较日期(可能会即时转换),找出女巫回合的结束日期最大
  • 获得正确的回合(未来的一些回合可能已经在数据库中,但当前回合可能是之前的另一轮,如果你知道我的意思的话)
我不是SQL方面的专家,所以我想知道你们会怎么做

以下是我当前的查询:

SELECT seasons.competition_id AS cid, 
       seasons.id AS sid, 
       rounds.id AS rid, 
       seasons.start_date AS sstart, 
       seasons.end_date AS send, 
       rounds.start_date AS rstart, 
       rounds.end_date AS rend, 
       round_groups.id AS rgid 
  FROM seasons 
INNER JOIN rounds ON seasons.id=rounds.season_id 
LEFT JOIN round_groups ON rounds.id=round_groups.round_id
ps:你可能会注意到我忘了提到的round_Group table,它是在某个赛季分组时使用的,比如欧足联和冠军联赛

编辑:


赛季是数据库中的一个条目,每个赛季更新一次,因为有些比赛会更改赛季赞助商的名称。这一轮每赛季至少改变一次,但可能会有更多的变化。在某些比赛中,比如欧足联,他们会先淘汰几轮,然后是小组赛,然后再淘汰,这将导致3轮不同的比赛。最终输出应该是关于每个季节的当前活跃的每一轮的列表。

让我们假设下表的定义(没有适当的索引或约束)

和一些样本数据

INSERT INTO seasons (competition_id,start_date,end_date,description) VALUES
  (1, '2007-3-15', '2007-9-15', 'FooCup 2007'),  
  (1, '2008-3-7', '2007-9-21', 'FooCup 2008'),  
  (1, '2009-4-1', '2007-9-21', 'FooCup 2009'),    
  (2, '2009-1-1', '2009-12-20', 'xyz 2009') 

INSERT INTO rounds (season_id, start_date, end_date, description) VALUES
  (1, '2007-3-15', '2007-4-15', 'foo 2007 1'),
  (1, '2007-4-16', '2007-8-15', 'foo 2007 2'),
  (1, '2007-8-16', '2007-9-15', 'foo 2007 3'),  
  (2, '2008-3-7', '2008-4-21', 'foo 2008 1'),
  (2, '2008-4-21', '2008-8-16', 'foo 2008 2'),
  (2, '2008-8-17', '2008-9-21', 'foo 2008 3'),
  (3, '2009-4-1', '2009-5-1', 'foo 2009 1'),
  (3, '2009-5-2', '2009-8-1', 'foo 2009 2'),
  (3, '2009-8-2', '2009-9-21', 'foo 2009 3'),
  (4, '2009-1-1', '2009-12-20', 'xyz ')
您需要一个固定时间/日期(fd),并希望记录在开始日期和结束日期之间具有此fd。准确地测试并使用日期/时间值。 例如

返回当时所有回合(所有比赛)的记录。
现在,您可以将其加入到季节表的季节id中。并将结果限制在某个特定的竞赛id(如果您愿意的话)

编辑:对不起,误读了问题。。。。 假设您知道比赛id并有固定日期(2009-08-16),您可以使用

SELECT
  s.id  
FROM
  seasons as s  
WHERE
  s.competition_id=1
  AND '2009-08-16' BETWEEN s.start_date AND s.end_date
现在您可以在赛季中加入。id=rounds.seasure\u id获得本赛季的所有回合

SELECT
  r.id  
FROM
  seasons as s  
JOIN
  rounds as r  
ON
  s.id=r.season_id
WHERE
  s.competition_id=1
  AND '2009-08-16' BETWEEN s.start_date AND s.end_date
(本例中为第7、8、9轮)。
将结果限制为最高round.id的最简单选项是让MySQL按rounds.id降序排列,并将结果限制为一条记录

SELECT
  r.id  
FROM
  seasons as s  
JOIN
  rounds as r  
ON
  s.id=r.season_id
WHERE
  s.competition_id=1
  AND '2009-08-16' BETWEEN s.start_date AND s.end_date
ORDER BY
  r.id DESC
LIMIT
  1

用于确保查询效率不太低…

我不明白-有很多关于日期和轮次的讨论,但是示例加入了
季节id
?你有什么?你想要什么样的最终输出?赛季是数据库中的一个条目,每个赛季更新一次,因为有些比赛会更改他们关于赛季赞助商的名称。这一轮每赛季至少改变一次,但可能会有更多的变化。在某些比赛中,比如欧足联,他们会先淘汰几轮,然后是小组赛,然后再淘汰,这将导致3轮不同的比赛。最终输出应该是每个季度当前活动的每一轮的列表。很高兴知道,但我仍然不清楚,抱歉。一个季度有3轮,这些轮有开始和结束日期。我需要的是根据当前的时间戳知道我应该得到哪一轮,并与每一轮的开始和结束日期进行比较,以知道它是否匹配。因此,简而言之,我需要知道如何将我提到的日期(使用该格式)转换为时间戳,以查看当前时间戳是否与“立即”进行的任何回合匹配。但这并不是最大的问题,问题是如果它没有找到与前面参数匹配的轮,它应该查找最晚的一个。谢谢,这提醒了我,我的表中的日期字段是VARCHAR,而不是date,这就是为什么我可能需要在比较之前转换它们。无论如何,这很有帮助,但我仍然需要知道如何获得最新一轮,以防不匹配。再次感谢,它没有完全符合我的需要,但给了我解决方案的希望,所以我接受你的答案。干杯
SELECT
  s.id  
FROM
  seasons as s  
WHERE
  s.competition_id=1
  AND '2009-08-16' BETWEEN s.start_date AND s.end_date
SELECT
  r.id  
FROM
  seasons as s  
JOIN
  rounds as r  
ON
  s.id=r.season_id
WHERE
  s.competition_id=1
  AND '2009-08-16' BETWEEN s.start_date AND s.end_date
SELECT
  r.id  
FROM
  seasons as s  
JOIN
  rounds as r  
ON
  s.id=r.season_id
WHERE
  s.competition_id=1
  AND '2009-08-16' BETWEEN s.start_date AND s.end_date
ORDER BY
  r.id DESC
LIMIT
  1