【问题标题】:Get Date Difference获取日期差异
【发布时间】:2015-01-22 11:33:01
【问题描述】:

我想在我的查询中获取两个日期之间的差异。我尝试使用多个选择语句,但它不起作用

这是我的代码

$tbl_name = "myTable";
$setDay = "10";

$stmt = $pdo->query("SELECT * (
              SELECT due_date,
                     date_paid,
                     DATEDIFF(due_date, date_paid) as date_interval) 
              FROM $tbl_name 
              WHERE DATEDIFF(due_date, date_paid) <= $setDay 
              ORDER BY trans_id DESC LIMIT $start, $limit");
$stmt->execute();

谢谢

【问题讨论】:

  • 这一行:WHERE DATEDIFF(due_date, date_paid)

标签: php mysql pdo


【解决方案1】:

首先开发您的 MySQL 查询并在 PHP 代码的上下文之外完善它们很重要,然后将查询集成到您需要的方式在 MySQL 客户端应用程序中 MySQL Workbench、PHPMyAdmin 等

在您的查询中,不需要外部SELECT,内部查询本身看起来几乎是正确的,但是您尝试使用 PDO 执行它的方式是错误的。

SELECT
  due_date,
  date_paid,
  DATEDIFF(due_date, date_paid) as date_interval
FROM $tbl_name
WHERE
  DATEDIFF(due_date, date_paid) <= $setDay
ORDER BY trans_id DESC
LIMIT $start, $limit

现在要在 PDO 中执行它,您应该使用 prepare()/bindParam()/execute() 创建一个准备好的语句,绑定参数,并使用这些参数执行它(但您不能绑定表名 - 它必须保留为变量)。在您当前的代码中,您混合了用于简单静态查询的 PDO::query() 方法和用于执行准备好的语句的 PDOStatement::execute() 方法。您应该使用准备好的语句方法,而不是query()

// Setup the statement with named parameters like :setDay
$sql = "
    SELECT
      due_date,
      date_paid,
      DATEDIFF(due_date, date_paid) as date_interval
    FROM $tbl_name
    WHERE
      DATEDIFF(due_date, date_paid) <= :setDay
    ORDER BY trans_id DESC
    LIMIT :start, :limit
";
// Make PDO throw useful errors on failure
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// Prepare the statement
$stmt = $pdo->prepare($sql);

// Bind your 3 parameters and execute it
$stmt->bindParam(':setDay', $setDay, PDO::PARAM_INT);
$stmt->bindParam(':start', $start, PDO::PARAM_INT);
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
$stmt->execute();

// Fetch your rows returned from the query
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Do something with them
print_r($rows);

我总是建议花时间使用 this PDO tutorial for MySQL developers,它将 PDO 的使用置于您可能已经熟悉的旧 mysql_*() API 的上下文中。

【讨论】:

  • 谢谢。但我还需要外部选择来显示表中的其他字段,这就是我添加它的原因。我如何实现这一目标,因为结果仍然与旧版本相同。谢谢
  • 您不需要外部选择 - 您只需将其他字段添加到 SELECT 列表。你只处理一个表,没有聚合,所以不需要子查询。
  • 如果您需要其他不符合要求的信息,您需要澄清您的问题。您指示错误的WHERE 条件是not 错误的,除非您在错误的位置使用带有结束) 的子查询。就像现在一样,您可以根据需要向SELECT 添加任意数量的附加字段。
  • @Chidi 请参阅this example...,如果您的情况更复杂,请编辑您的问题以包含表中的示例行以及您希望查询输出来自这些行的示例.
  • 你第一次是对的。我想知道我的第二个职位,但在路上,当我回来时会给它一个简短的。谢谢
【解决方案2】:

试试这个,

SELECT * , (select (DATEDIFF(due_date,date_paid)) AS date_interval) FROM $tbl_name

【讨论】:

    【解决方案3】:

    使用它来查找日期差异,

          $diff=date_diff($date1,$date2);
    

    【讨论】:

    • OP 需要计算查询内部的差异,以便在 WHERE 条件下使用,而不是在 PHP 外部。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2018-02-09
    • 2017-04-04
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多