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