11

我不知道如何找到日期类型中的最低字符串

我只会找到最低的月份(在表格中按年份)

表名

Id  | M  | D  |   Y   |
=======================
1  | 01  | 22  | 2012 |
2  | 11  | 29  | 2012 |
3  | 12  | 30  | 2013 |
4  | 01  | 30  | 2011 | <--- this !
5  | 12  | 14  | 2012 |

PHP:

$sql = "SELECT * FROM TableName WHERE M=?? AND Y=??";
$selected = mysql_query($sql);

所以$selected应该给我一个类似“4/01/30/2011”的结果(Id,M,D,Y)

任何?

4

8 回答 8

17
SELECT min(concat(Y,M,D)) FROM TableName

编辑:这看起来很干净,但这是一个非常糟糕的答案,所以请使用这个答案

于 2012-12-03T11:37:50.500 回答
11

只需使用ORDER BY子句:

SELECT * FROM TableName
ORDER BY Y ASC, M ASC, D ASC

更多信息在这里:http ://www.tizag.com/mysqlTutorial/mysqlorderby.php

于 2012-12-03T11:38:46.243 回答
10

bugwheels94 的回答会给你正确的结果:

SELECT min(concat(Y,M,D)) 
  FROM `TableName`

但这将无法使用您在日期的任何组成字段上拥有的任何索引,因此必须访问表中的每一行以确定最小值。

结合 m4t1t0 和 koopajah 的答案给你:

  SELECT * 
    FROM `TableName`
ORDER BY Y, M, D 
   LIMIT 1

这将能够使用 Y 上的可用索引,甚至可能使用 (Y,M,D) 上的组合索引,这可以在更大的表上执行得更快。

说了这么多;回答这个不建议使用日期字段而不是三列设置的问题几乎是犯罪。我能想到分离日期列的唯一原因是为了在需要在日或月单独索引的利基查询上提高性能,但接受的答案的选择向我表明事实并非如此。

正如 Lucius 所指出的 .. 如果是日期,请将其存储为日期并运行:

SELECT MIN(`DateColumnName`) FROM `TableName`

作为奖励,这将使您可以访问列上的所有 MySQL 临时函数,包括提取日期和月份、按您喜欢的方式格式化以及索引和排序的单个字段的能力。

于 2016-03-29T10:44:43.593 回答
9

请帮自己一个忙,改用一个date字段..你会为自己省去很多麻烦。

ALTER TABLE `TableName` ADD `date` DATE NOT NULL;
UPDATE `TableName` SET `date` = CONCAT( `Y` , '-', `M` , '-', `D` );

那么你就可以做到:

SELECT MIN(`date`) FROM `TableName`
于 2012-12-03T12:15:06.340 回答
5

只需按年、月和日执行查询排序,并将结果限制在第一行。

SELECT * FROM TableName ORDER BY Y, M, D ASC limit 1;
于 2012-12-03T11:39:21.640 回答
4

尝试这个:

SELECT MIN(ColumnName) FROM TableName;

在你的情况下,那将是:

SELECT MIN(Y) FROM TableName;
于 2012-12-03T11:37:41.857 回答
2

我正在为您的查询提供一些想法。请遵循:

$sql="SELECT * FROM tbl_name ORDER BY Y, M, D ASC limit 1;
$res=mysql_query($sql);
$row=mysql_fetch_array($res);

$date=$row["id"]."/".$row["M"]."/".$row["D"]."/".$row["Y"];
echo $date;

我希望它会帮助你

于 2016-03-28T10:57:09.237 回答
2
SELECT concat(Y,M,D) FROM TableName
ORDER BY Y ASC, M ASC, D ASC
Limit 1

这样,您可以通过将“concat(Y,M,D)”替换为 * 来返回整行,并轻松适应不同的用例。例如,您可以通过以下方式返回第一年内的最后一个日期行:

SELECT * FROM TableName
ORDER BY Y ASC, M DESC, D DESC
Limit 1

存储为 DATETIME 并使用本机 MySQL 排序会大大加快速度。如果您需要保留单独的值(无论出于何种原因,例如导入/导出其他系统超出您的范围),也许您可​​以向表中添加另一个值并同步这些值?

于 2016-04-03T17:21:40.100 回答