在sql中查找日期范围的最小值和最大值

时间:2016-11-03 23:44:51

标签: mysql date

我继承了一个名为' dateRange'的数据库。我被要求找到最早/开始和最晚/结束日期。以下是原始数据列的外观:

dateRange Column

这是我的SQL查询:

.parent {
  background: red;
  max-width: 90%;
  display: inline-block;
}
img {
  width: 100px;
  height: 100px;
  background-color: grey;
}

Output from Query

输出显示两列有两个值:1)EarliestDay(01/01)和2)LatestDay(01/31/15)。

显然,这是不正确的,因为最新日期应该是12/31/15而不是2015年1月31日。

我做错了什么?任何反馈将不胜感激。

1 个答案:

答案 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;

结果:

enter image description here

下一步 - 将这些字符串转换为日期。好吧,这只是用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;

结果:

enter image description here

最后一步 - 找到最早的'从'日期和最新'到'日期:

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;

结果:

enter image description here