【问题标题】:How do I order my table by the date entered by user如何按用户输入的日期订购我的桌子
【发布时间】:2017-12-13 07:00:54
【问题描述】:

这是我的表的代码:

<table border="black">
    <tr><th>Date</th><th>Newsletter ID</th></tr>


        <?php
        while ($row = oci_fetch_array($stid)):
        echo "<tr><td>" . htmlentities($row["DATE_ENG"]) . "</td>";
        echo "<td>" . htmlentities($row["FEATURE_TITLE_ENG"]) . "</td>";
        $NewsIDN = $row["NEWS_IDN"];
        ?>
        <td>
        <form name="editEmail" action="editEmail.php" method="GET">
            <input type="hidden" name="EmailID" value="<?php echo $NewsIDN; ?>"/>

            <input type="hidden" name="action" value="e"> 
            <input type="submit" name="editEmail" value="Edit"/>
        </form>
    </td>
    <td>
        <form name="deleteEmail" action="deleteEmail.php" method="POST">
            <input type="hidden" name="newsIDN" value="<?php echo $NewsIDN; ?>"/>
            <input type="submit" name="deleteEmail" value="Delete" action="deleteEmail.php" onclick="return confirm('Are you sure want to delete')"/>
        </form>



    </td>

这是接收数据的查询。如何使它在正确的日期之前从上到下对表格进行排序,以便 2013 年 1 月在 2013 年 5 月之前?

public function get_Newsletters() {
$query = "SELECT         NEWS_IDN,DATE_ENG,DATE_FRA,FEATURE_TITLE_ENG,FEATURE_TITLE_FRA,FEATURE_DESC_ENG,FEATURE_DESC_FRA,FEATURE_IMG_URL_ENG,FEATURE_IMG_URL_FRA,FEATURE_IMG_ALT_ENG,FEATURE_IMG_ALT_FRA,FEATURE_URL_ENG,FEATURE_URL_FRA,LAST_MODIFIED_BY,LAST_MODIFIED_DT,PUBLISHED_IND FROM BETS.TB__BETS_NEWSLETTERS ORDER BY DATE_ENG";
$stid = oci_parse($this->con, $query);
oci_execute($stid);
return $stid;
}

所以表正在调用上面的查询,而现在我只是在做 ORBEDER BY DATE_ENG

【问题讨论】:

  • 日期是以什么格式存储的?
  • DATE_ENG 列的类型是什么
  • 日期只是一个字符串,它实际上可以像任何单词一样输入
  • 示例我有一些完整的日期,例如 1993 年 4 月 19 日,然后是一些纯文本作为测试或示例
  • 你的表中DATE_ENG使用了什么数据类型?这仅适用于 DATETIME 列。

标签: javascript php html html-table sql-order-by


【解决方案1】:

MySQL 的默认排序顺序是 ASC,这意味着行从最低到最高排序,在日期值中,这变成了从早到晚的时间。

您正在使用“按 DATE_ENG ASC 排序”,这会将日期从小到大排序。而你想要的,就应该通过它来实现。

如果相反,请尝试“order by DATE_ENG DESC”

如果您的 DATE_ENG 是 varchar 类型,那么排序是按照 alpebetically 进行的,并且取决于您的日期格式,可能不是您想要的。

最好的用法是,对于日期字段总是使用 unix TIMESTAMP 或 DATETIME,然后使用“order by”语句总是会给你正确的结果。

这种方法的优点是几乎每种语言都有默认处理 unix TIMESTAMP 和 mysql DATETIME 格式的工具。

【讨论】:

  • 我做了 ASC,但它使 1999 年 12 月 31 日早于 2012 年 5 月 12 日......?
  • ASC 是默认值,如果您的 mysql 列类型是 DATETIME 则使用 DESC,这会使以后的日期优先。我更新了我的答案,再次阅读可能会有所帮助。
  • 哦,所以我需要将数据库中的列类型更改为 DATETIME?
  • 如果将日期存储为 DATETIME 类型,将更精确,更易于排序和处理。您当前的 DATE_ENG 字段类型是什么?
【解决方案2】:

DATE_ENG 应该是 DATEDATETIME 数据类型。没有它,它就无法准确排序。更改后,您可以使用now() 将日期插入数据库。然后您可以通过ORDER BY DATE_ENGORDER BY DATE_ENG DESC 正确订购

datetime 数据类型上查看more information

【讨论】:

  • 哦,好吧,它只是一个字符串数据类型,而不是日期或任何我的问题
  • 没错!它不应该是一个字符串。改一下,你的问题就解决了。
【解决方案3】:

如果日期以 m/d/Y 这种格式存储在列中,这将产生 order by 如果您的格式不同,则在 STR_TO_DATE 函数中使用该特定日期格式

SELECT NEWS_IDN,DATE_ENG,DATE_FRA,FEATURE_TITLE_ENG,FEATURE_TITLE_FRA,
FEATURE_DESC_ENG,FEATURE_DESC_FRA,FEATURE_IMG_URL_ENG,FEATURE_IMG_URL_FRA,
FEATURE_IMG_ALT_ENG,FEATURE_IMG_ALT_FRA,FEATURE_URL_ENG,FEATURE_URL_FRA,
LAST_MODIFIED_BY,LAST_MODIFIED_DT,PUBLISHED_IND FROM BETS.TB__BETS_NEWSLETTERS
ORDER BY STR_TO_DATE(DATE_ENG, '%m/%d/%Y') ASC

这里是某些列的sql fiddle,但即使您的列类型不是日期,它也是为了向您展示它是如何工作的

【讨论】:

  • 嘿,我这样做了,但我没有标识符 STR_TO_DATE
  • 这是一个mysql函数,如果你的列类型不是日期,它将被视为日期
  • 如果您处于开发阶段的早期,我强烈建议您将数据类型更改为 DATEDATETIME。它将使您免于未来的大量问题。将日期存储为字符串是一种糟糕的做法。
猜你喜欢
  • 2021-11-28
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多