【问题标题】:Date returning null when no null in table表中没有 null 时返回 null 的日期
【发布时间】:2018-02-13 10:21:37
【问题描述】:

我正在尝试显示橄榄球比赛的详细信息,我想要的详细信息是比赛 ID、比赛日期、比赛时间、主队、客队、主队比分、客队比分。

我需要 SQL 语句来查看比赛日期以计算出分数(因为分数多年来一直在变化)。

以下语句适用于所有以前的评分结构,但当它到达最近的(当前的结束日期为空)时,它会中断。

问题不在于它没有结束日期,因为我有它,所以如果日期为空,它会设置今天的日期,而是它从信息中丢失了日期,我不知道为什么。

SELECT 
M.MatchID, 
DATE_FORMAT(M.Date, '%d %b %Y'), 
TIME_FORMAT(M.time, '%l:%i %p') AS time,
T1.name, 
T2.name, 
SUM(M.HTries * S.Try) + SUM(M.HConv * S.Conv) + SUM(M.HPT * S.PT) + SUM(M.HPG * S.PG) + SUM(M.HDG * S.DG) AS HScore,
SUM(M.ATries * S.Try) + SUM(M.AConv * S.Conv) + SUM(M.APT * S.PT) + SUM(M.APG * S.PG) + SUM(M.ADG * S.DG) AS AScore,
S.ScoreDateFrom AS ScoreDateFrom,
CASE WHEN NOT S.ScoreDateTo = '0000-00-00' then S.ScoreDateTo ELSE CURDATE() 

END AS ScoreDateTo
FROM 
scoring S, matches M
LEFT JOIN teams T1
    ON T1.TeamID=M.HTeam
LEFT JOIN teams T2
    ON T2.TeamID=M.ATeam
WHERE 
    M.Date >= ScoreDateFrom and M.Date <= ScoreDateTo and M.MatchID = 1;

如果我选择匹配 1,它基于旧的计分结构,我会得到所有正确的信息:

+---------+---------------------------------+---------+-------------+-----------+--------+--------+---------------+-------------+                  
| MatchID | DATE_FORMAT(M.Date, '%d %b %Y') | time    | name        | name      | HScore | AScore | ScoreDateFrom | ScoreDateTo |                  
+---------+---------------------------------+---------+-------------+-----------+--------+--------+---------------+-------------+                  
|       1 | 22 Oct 2016                     | 7:35 PM | New Zealand | Australia |     37 |     10 | 2016-05-22    | 2017-07-31  |                  
+---------+---------------------------------+---------+-------------+-----------+--------+--------+---------------+-------------+ 

但如果我设置为最近的游戏,我会得到:

+---------+---------------------------------+---------+----------+--------+--------+--------+---------------+-------------+                        
| MatchID | DATE_FORMAT(M.Date, '%d %b %Y') | time    | name     | name   | HScore | AScore | ScoreDateFrom | ScoreDateTo |                        
+---------+---------------------------------+---------+----------+--------+--------+--------+---------------+-------------+                        
|      93 | 11 Feb 2018                     | 3:00 PM | Scotland | France |   NULL |   NULL | NULL          | 2018-02-13  |                        
+---------+---------------------------------+---------+----------+--------+--------+--------+---------------+-------------+ 

其中包含评分详情的表格如下所示:

+---------+---------------+-------------+------+------+------+------+------+------+---------------------+                                          
| ScoreID | ScoreDateFrom | ScoreDateTo | Try  | PT   | Conv | PG   | DG   | Mark | Update_TS           |                                          
+---------+---------------+-------------+------+------+------+------+------+------+---------------------+                                          
|       1 | 1977-01-01    | 1992-06-30  |    4 |    4 |    2 |    3 |    3 |    0 | 2017-02-08 17:56:39 |                                          
|       2 | 1992-07-01    | 2016-05-13  |    5 |    5 |    2 |    3 |    3 |    0 | 2018-02-13 01:42:29 |                                          
|       3 | 1971-09-01    | 1976-12-31  |    4 |    4 |    2 |    3 |    3 |    3 | NULL                |                                          
|       4 | 2017-08-01    | 0000-00-00  |    5 |    7 |    2 |    3 |    3 |    0 | NULL                |                                          
|       5 | 2016-05-14    | 2016-05-21  |    6 |    8 |    2 |    2 |    3 |    0 | NULL                |                                          
|       6 | 2016-05-22    | 2017-07-31  |    5 |    5 |    2 |    3 |    3 |    0 | NULL                |                                          
+---------+---------------+-------------+------+------+------+------+------+------+---------------------+ 

如果您能告诉我出了什么问题,不胜感激?

谢谢

【问题讨论】:

  • 不确定是不是问题,但请参阅stackoverflow.com/questions/2660497/…
  • 感谢您对帖子的修复,我查看了链接,但似乎不是同一个问题。
  • 我最初确实首先有匹配项,但它没有工作,所以切换了它们,所以它大部分时间都可以工作。我相信如果这是问题,它根本不会起作用(但我愿意被纠正)。
  • @RBurns,请给我们看一下id=93的评分表记录?

标签: mysql sql


【解决方案1】:

您不能在WHERE 子句中引用SELECT 列表中的别名。所以WHERE M.Date &gt;= ScoreDateFrom and M.Date &lt;= ScoreDateTo and M.MatchID = 1; 使用实际表中ScoreDateTo 的值,而不是调整后的CURDATE()。您需要在 WHERE 中重复该调整。

WHERE M.Date >= ScoreDateFrom and M.Date <= IF(ScoreDateTo = '0000-00-00', CURDATE(), ScoreDateTo) and M.MatchID = 1;

【讨论】:

  • 您先生,真是个天才!就是这样,非常感谢!
【解决方案2】:

您参加比赛和得分的方式。

2018 年 2 月 11 日的比赛没有相关的得分记录。

因此,当连接发生时,对于该匹配,它将为评分中的任何字段返回 NULL。

【讨论】:

  • 不确定我是否跟随,但我感觉你可能是对的。游戏确实有得分(尝试次数、转换次数等),但没有根据得分表中的最新记录计算总得分。
  • 和 M.Date
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多