【问题标题】:I have a MySQL Date formatting that returns old records我有一个返回旧记录的 MySQL 日期格式
【发布时间】:2016-10-03 15:34:50
【问题描述】:

所以我有点糊涂了。我的客户选择 10-01-2016($datefrom 变量)和 10-02-2016($dateto 变量)。执行时,它将返回 2015 年和 2016 年的日期。

这是我的 php 代码:

$datefrom = $mysqli->real_escape_string($_GET['datefrom']);

$dateto = $mysqli->real_escape_string($_GET['dateto']);

$query = "SELECT * FROM tbl_Dates WHERE (DATE_FORMAT(date, '%m-%d-%Y') BETWEEN '$datefrom' AND '$dateto') AND date_type='1'";

当我在 MySQL 中运行以下查询时(只是替换变量):

SELECT * FROM tbl_Dates WHERE (DATE_FORMAT(date, '%m-%d-%Y') BETWEEN '10-01-2016' AND '10-02-2016') AND date_type='1';

它运行并提供 2015 年和 2016 年的日期记录。

当我将 DATE_FORMAT 行和变量更改为以下内容时:

SELECT * FROM tbl_Dates WHERE (DATE_FORMAT(date, '%Y-%m-%d') BETWEEN '2016-10-01' AND '2016-10-02') AND date_type='1';

运行良好,只给出 2016 年的日期记录。

系统大约有一年的历史了,哈哈,这就是为什么它现在给出错误的原因。如何更正 SQL 语法以使其正确查询,而无需更改使用 %d-%m-%Y 格式的行的 php 代码?

感谢你们提供的任何帮助, 吉姆

【问题讨论】:

  • 那么这是第10年第1个月的第2016天?
  • 我不会在 PHP 中解析日期以避免在 sql 语句中使用 DATE_FORMAT。您的查询将解析所有表的所有日期。如果您改为传递正确格式的日期,则不会执行此操作,并且错误可能就是这种方式。

标签: php mysql


【解决方案1】:

由于您的日期不是yyyy-mm-dd 格式,MySQL 会将它们比较为 STRINGS,而不是日期。

意思是

10-23-2016 > 10-24-2015 

FALSE,因为在字符串比较中34 小。我们人类知道这是一个日期并且知道 2016 年是在 2015 年之后的事实是无关紧要的。 MySQL 不是人类,也不是 AI,当它看到字符串时,会将它们作为字符串进行比较。

如果您想在 MySQL 中进行“日期数学”,那么您必须使用原生格式。

【讨论】:

    【解决方案2】:

    试试这个,

    $datefrom = $mysqli->real_escape_string($_GET['datefrom']);
    
    $dateto = $mysqli->real_escape_string($_GET['dateto']);
    
    $query = "SELECT * FROM tbl_Dates WHERE date BETWEEN STR_TO_DATE('$datefrom','%m-%d-%Y') AND STR_TO_DATE('$dateto','%m-%d-%Y')) AND date_type='1'";
    

    STR_TO_DATE 将格式化字符串转换为日期,

    DATE_FORMAT() 将转换格式化的字符串表示形式。

    【讨论】:

      【解决方案3】:

      这是有效的:

      $query = "SELECT * FROM tbl_Dates WHERE (DATE_FORMAT(date, '%Y-%m-%d') BETWEEN STR_TO_DATE('$datefrom', '%m-%d-%Y') AND STR_TO_DATE('$dateto', '%m-%d-%Y')) AND date_type='1'";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多