我继承了一个名为' dateRange'的数据库。我被要求找到最早/开始和最晚/结束日期。以下是原始数据列的外观:
这是我的SQL查询:
.parent {
background: red;
max-width: 90%;
display: inline-block;
}
img {
width: 100px;
height: 100px;
background-color: grey;
}
输出显示两列有两个值:1)EarliestDay(01/01)和2)LatestDay(01/31/15)。
显然,这是不正确的,因为最新日期应该是12/31/15而不是2015年1月31日。
我做错了什么?任何反馈将不胜感激。
答案 0 :(得分:0)
@EarliestDate
和@LatestDate
都存储为字符串,而非日期。
所以MySQL将它们排序为字符串,这意味着MAX和MIN按字母顺序为您提供第一个和最后一个。
要让MySQL正确排序,您需要将字符串转换为DATE
,然后MAX和MIN将返回最早和最晚的日期。
详细了解如何将文字转换为日期here。
修改强>
好的 - 让我们一步一步来做。 第一步是将每个记录从'和'分成'日期,仍然将它们保留为字符串。
请注意,'from'日期缺少年份,因此我们需要从'到'日期获取此年份。
这是一个查询:
SELECT dateRange,
CONCAT(SUBSTRING_INDEX(`dateRange`,'-',1), '/', SUBSTRING_INDEX(`dateRange`,'/',-1)) AS from_date,
SUBSTRING_INDEX(`dateRange`,'-',-1) AS to_date
FROM dateRangeTable;
结果:
下一步 - 将这些字符串转换为日期。好吧,这只是用STR_TO_DATE函数将它们完全包裹起来:
SELECT dateRange,
STR_TO_DATE(CONCAT(SUBSTRING_INDEX(`dateRange`,'-',1), '/', SUBSTRING_INDEX(`dateRange`,'/',-1)), '%m/%d/%y') AS from_date,
STR_TO_DATE(SUBSTRING_INDEX(`dateRange`,'-',-1), '%m/%d/%y') AS to_date
FROM dateRangeTable;
结果:
最后一步 - 找到最早的'从'日期和最新'到'日期:
SELECT
MIN(STR_TO_DATE(CONCAT(SUBSTRING_INDEX(`dateRange`,'-',1), '/', SUBSTRING_INDEX(`dateRange`,'/',-1)), '%m/%d/%y')) AS min_from_date,
MAX(STR_TO_DATE(SUBSTRING_INDEX(`dateRange`,'-',-1), '%m/%d/%y')) AS max_to_date
FROM dateRangeTable;
结果: