【问题标题】:MySQL select table column 31-12-2014 type varchar as date order by date phpMySQL select table column 31-12-2014 type varchar as date order by date php
【发布时间】:2014-12-25 20:06:36
【问题描述】:

由于设计原因,我有一个表格,其中有 3 个选择下拉菜单(日、月和年)分开 我在将日期保存到 mysql 之前使用 Post (d) Post m Post (Y) 插入日期,如 $d-$m-$Y 从表单方法 post 我将日期保存在 varchar 20 列中,加入 dmY 和很省钱

日期正常显示 30-10-2014

现在的问题是,在搜索结果页面中,我想在日期 A 到 B 之间搜索结果并获取任何内容

此外,在搜索结果中,我按日期排序,我得到的结果来自任何日期

我不知道如何使用保存在 varchar 中的这种日期来排序或过滤结果,这是我现在正在测试的内容

$result = mysqli_query($db, "SELECT product, price, DATE_FORMAT(date, '%d-%m-%Y') AS new_date FROM `tableone` WHERE `user` = '$usernamefromform' ORDER BY `new_date` DESC Limit $start, $per_page");

我怎样才能在不改变太多特别是我的设计的情况下解决这个问题

【问题讨论】:

  • 将日期存储为 varchar 的错误计划。现在,当您想将数据列用作日期时,您每次都必须处理这个问题。您不必为显示而格式化它,但在其他任何事情上都做了更多的工作。这是倒退的——您将数据以结构化的 data 格式放入数据库,然后在显示时更改格式以用于显示目的。我建议您现在停止并修复您的数据库架构,而不是解决这个特定问题(可能可以使用CAST 或类似的方式完成)。

标签: php html mysql date


【解决方案1】:

您在正确的轨道上,但在定义 DATE_FORMAT 之前,您需要将您的 VARCHAR 转换为日期。此外,您需要以可以正确排序的方式格式化日期(因此仅由 ORDER BY 使用)但以存储方式显示它(如果这是您想要的):

SELECT product, price, date 
FROM `tableone` 
WHERE `user` = '$usernamefromform' 
ORDER BY DATE_FORMAT(STR_TO_DATE(date, '%d-%m-%Y'), '%Y%m%d') DESC

用它构造一个BETWEEN 查询真的很糟糕(并且可能会减慢一切),但是当您将VARCHAR 转换为DATE 时,您现在可以使用以下查询:

SELECT product, price, date 
FROM `tableone`
WHERE `user` = '$usernamefromform' AND (date BETWEEN '2014-01-30' AND '2014-12-31')
ORDER BY date DESC

【讨论】:

  • 此查询解决了症状,但未治疗疾病。日期的 Varchar 设计不好,应该在数据库中修复。否则他将不得不在他想要排序或使用between 的任何时候用这个样板来填充他的代码。糟糕。
  • 完全正确,我不鼓励这种解决方案,但 OP 写它是设计使然,因此我猜他正在维护一个现有项目并需要一个答案。
  • Paul 只是一个小问题:它按日期过滤完美,但我不知道如何从日期到日期之间生成搜索结果
  • 好吧,正如 Chris 所说,这是错误的方法,因为您需要在任何地方使用该构造。但是你写的是把VARCHAR的列改成了DATE,你的数据现在是怎么存储的?
  • 从 VARCHAR 更改为 DATE,首先它存储在 31-12-2014 (dmY) 并且我更改了它的存储方式是 2014-12-31 (Ymd) 所以也许我不需要新的方式日期格式不再,mysql会找到没有问题的结果?我是新来的日期
【解决方案2】:

将日期以 DD-MM-YYYY 格式存储在 varchar 中是一个非常糟糕的主意。这会阻止您按日期订购或搜索两个日期之间的日期。

如果您将其更改为 YYYY-MM-DD 格式并将其存储在日期字段中,它将解决您的所有问题:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-22
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    相关资源
    最近更新 更多