【问题标题】:Format date in MySQL SELECT as ISO 8601将 MySQL SELECT 中的日期格式化为 ISO 8601
【发布时间】:2012-03-08 11:20:34
【问题描述】:

我正在尝试以标准时间戳从我的数据库中获取日期并将其显示为 ISO 8601。我无法在 PHP 中轻松完成此操作,因此我尝试在我的 SELECT 语句中执行此操作。这是我所拥有的,但它显示错误:

SELECT * FROM table_name ORDER BY id DESC DATE_FORMAT(date,"%Y-%m-%dT%TZ")

我做错了什么?

【问题讨论】:

    标签: mysql database date-format iso8601


    【解决方案1】:

    DATE_FORMAT(DateColumn) 必须在 SELECT 列表中:

    SELECT DATE_FORMAT(date, '%Y-%m-%dT%TZ') AS date_formatted
    FROM table_name 
    ORDER BY id DESC 
    

    【讨论】:

    • 这在西班牙等某些地区不起作用。在时间 +01:00 之后,他们需要时差而不是 Z。在 php 中这很好用: date("c", strtotime($comment['datetime'])),
    • 对我也不起作用,最后一个格式值类似于 530Z 而不是 +02:00
    • @David 这是因为这个函数假定 DateTime 是 UTC。
    • @MladenJanjetović Z 不是一个参数(否则它会以 % 开头),它只是 ISO 8601 用于指定时区为 UTC 的约定。因此,如果您将日期时间存储在不同的时区,请先将其转换为 UTC,然后使用此格式字符串。最好在 UTC 时区而不是您自己的服务器时区中发送 ISO 8601 日期。
    • 不完全是问的问题,但谷歌把我带到了这里:要以毫秒为单位获取 ISO 字符串格式,我必须使用 DATE_FORMAT(date, '%Y-%m-%dT%T.000Z')
    【解决方案2】:

    这对我有用

    DATE_FORMAT( CONVERT_TZ(`timestamp`, @@session.time_zone, '+00:00')  ,'%Y-%m-%dT%TZ')
    

    【讨论】:

      【解决方案3】:

      DATE_FORMAT 仅适用于 MySQL 日期列,不适用于时间戳。

      UNIX 时间戳是一个整数,包含自 1970 年 1 月 1 日 UTC 以来的秒数。要将其格式化为 ISO 8601 日期,您需要改用 FROM_UNIXTIME() 函数。

      FROM_UNIXTIME 采用与 DATE_FORMAT 相同的格式字符串,因此要格式化名为“created”的列,您需要:

      SELECT created /* e.g. 1288799488 */ , 
             FROM_UNIXTIME(created,'%Y-%m-%dT%TZ') /* e.g. 2010-11-03T08:51:28Z */
      FROM table_name
      

      【讨论】:

        【解决方案4】:

        从数据库中加载日期字段并使用 PHP 将其转换为 ISO 格式非常简单;查看c 格式字符串到PHP date: http://www.php.net/manual/en/function.date.php

        echo date('c'); // expected "2013-03-08T14:45:37+05:00"
        

        【讨论】:

        • 这是 PHP 函数,不是 MySQL 函数。
        • OP 表示在 PHP 上执行操作有困难。我提供了那部分答案。
        【解决方案5】:

        为什么在 PHP 中很难做到?

        date("Y-m-d\TH:i:sO",strtotime($sqldata['time']));
        

        无论如何,DATE_FORMAT 需要在字段中进行选择,而不是添加到最后。

        【讨论】:

        • date("c", strtotime($sqldata['time'])); php date function
        • 附带说明:如果数据集非常大,使用 PHP 转换日期可能会导致服务器内存问题。
        • @GuntramBlohmsupportsMonica 也许不是,但 OP 是,所以我提供了一个 PHP 解决方案。
        【解决方案6】:

        DATE_FORMAT(date, '%Y-%m-%dT%TZ') 应该在select 子句中。

        SELECT DATE_FORMAT(date, '%Y-%m-%dT%TZ') 
        FROM table_name 
        ORDER BY id DESC 
        

        【讨论】:

          【解决方案7】:

          您应该将 DATE_FORMAT 移动到查询的选择部分,如下所示:

          SELECT *, DATE_FORMAT(date,"%Y-%m-%dT%TZ") AS date FROM table_name ORDER BY id DESC
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-06
            • 1970-01-01
            • 2013-05-22
            • 1970-01-01
            • 2022-10-15
            • 1970-01-01
            相关资源
            最近更新 更多