【问题标题】:MYSQL Date Range RFC 2822MYSQL 日期范围 RFC 2822
【发布时间】:2012-12-08 11:45:30
【问题描述】:

情况 我提取格式为 RFC 2822(星期六,2012 年 12 月 1 日 05:49:45 +0000)的时间戳并将它们存储在 MYSQL 的 VARCHAR 字段中。我有一个 start_date 和 end_date。

目标 在两个日期之间搜索(例如 start_date BETWEEN '2012-11-01' AND '2012-12-01')

条件 我想用纯 SQL 做到这一点,而不是在 PHP 中进行后期处理

可接受的妥协 我不想,但如果需要,我会使用 PHP 将它们转换并存储为 DATETIME。

谁能帮助我实现我的目标(如上所列)。 瑞克

【问题讨论】:

    标签: mysql search datetime between rfc2822


    【解决方案1】:

    您可以使用 str_to_date 将字符串日期转换为日期时间:

    select str_to_date('Sat, 01 Dec 2012 05:49:45 +0000','%a, %d %b %Y %T')
    

    如果你还需要转换时区,试试这个:

    set @datestring='Sat, 01 Dec 2012 05:49:45 +0000';
    select
      CONVERT_TZ(
        str_to_date(@datestring,'%a, %d %b %Y %T'),
        concat(mid(@datestring, 27, 3), ':', mid(@datestring, 30, 2)),
        '+00:00'
      )
    

    【讨论】:

    • 我实际上是在这条路线上,但是当我到达时区时碰壁了。没有办法使用 SQL 来解析它。
    • @RickS 有函数 CONVERT_TZ,我想你可以让它工作,我会更新我的答案
    【解决方案2】:

    将时间戳存储为字符串是对数据库功能的不良使用。由于它们都是相同的格式,因此可以很容易地在输入时将它们转换为日期时间。

    【讨论】:

      【解决方案3】:

      将它们存储为原生 DATETIME。这是唯一明智的方法。

      您为什么如此反对使用合适的工具来完成工作?

      【讨论】:

      • 我想我会这样做,因为表格很新,我可以开始将 RFC2822 日期转换为日期时间,如下所示:$timestamp = strtotime('Tue, 30 Sep 2008 10:30:00 EDT'); echo date('Y-m-d g:i:s a', $timestamp);
      • 越早切换到原生数据类型越好。尽可能使用适当的列类型。存储字符串日期和时间的唯一原因是它们是否来自外部数据源,并且您希望确保已正确转换它们,保留原始值和转换后的值以供比较。
      猜你喜欢
      • 2012-01-28
      • 2011-01-28
      • 2011-03-28
      • 1970-01-01
      • 2013-05-15
      • 2010-10-27
      • 2015-12-04
      • 1970-01-01
      • 2014-10-11
      相关资源
      最近更新 更多