【问题标题】:Find lowest date (custom) in mysql在mysql中查找最低日期(自定义)
【发布时间】:2012-11-20 20:49:26
【问题描述】:

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

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

表名

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)的结果

有吗?

【问题讨论】:

  • Why shouldn't I use mysql_ PHP 中的函数?*
  • 为什么不按 ID、日期搜索?返回mysql中最高或最低的id或日期
  • 嘿,请不要选择我的答案作为选择之一,因为它不是最好的方法

标签: php mysql sql


【解决方案1】:
SELECT min(concat(Y,M,D)) FROM TableName

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

【讨论】:

  • 好的,我如何打印像“4/01/30/2011”(Id,M,D,Y)这样的结果?我对mysql很陌生
  • mysql_fetch_array() ?,现在得到
  • 我得到了最低的 D、M 但不是 Y :/
  • @DuD。肯定的,但有问题的是它是填充的,所以这里没有错
【解决方案2】:

只需使用ORDER BY 子句:

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

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

【讨论】:

    【解决方案3】:

    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 临时函数,包括提取日期和月份、按您喜欢的方式设置格式以及用于索引和排序的单个字段的能力。

    【讨论】:

      【解决方案4】:

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

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

      那么你就可以做到:

      SELECT MIN(`date`) FROM `TableName`
      

      【讨论】:

        【解决方案5】:

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

        SELECT * FROM TableName ORDER BY Y, M, D ASC limit 1;
        

        【讨论】:

          【解决方案6】:

          试试这个:

          SELECT MIN(ColumnName) FROM TableName;
          

          在你的情况下,那将是:

          SELECT MIN(Y) FROM TableName;
          

          【讨论】:

            【解决方案7】:

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

            $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;
            

            希望对你有帮助

            【讨论】:

            • 日期的东西可以用 MySQL 完成,所以不需要获取所有的数据让 php 完成工作。
            【解决方案8】:
            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 排序会大大加快速度。如果您需要保留单独的值(无论出于何种原因,例如导入/导出与其他系统超出您的范围),也许您可​​以向表中添加另一个值并同步这些值?

            【讨论】:

              猜你喜欢
              • 2021-12-23
              • 1970-01-01
              • 1970-01-01
              • 2017-03-06
              • 1970-01-01
              • 2015-02-08
              • 1970-01-01
              • 2022-01-24
              • 1970-01-01
              相关资源
              最近更新 更多