代码之家  ›  专栏  ›  技术社区  ›  EvilChookie

比较MySQL中的两个时间戳,然后返回一个自定义字段

  •  1
  • EvilChookie  · 技术社区  · 15 年前

    我正在用PHP构建一个小规模的论坛脚本,我很难演示给定线程的读/未读状态。

    因此,我有一个特别庞大的查询,它返回线程信息,包括它第一次发布的日期、它最后一次发布的日期(如果有的话)以及它最后一次被当前登录的用户看到的日期(如果存在这样的日期)。

    然后查询返回三个值:

    • 第一次邮递日期
    • 最后日期
    • 最后查看日期

    我需要检查的是,如果firstpostdate或lastpostdate比lastviewdate最近,那么将该线程标记为新的/有未读回复。

    在PHP中执行这个操作时,我遇到了一些问题,因为我的日期都存储在MySQL中作为时间戳。起初我以为我可以使用Unix时间戳返回一个Unix时间戳,然后比较它们,但是我不相信我得到了正确的结果(因为时间戳是Y-M-D H-M-S格式(或者类似的,我记不清了)。

    我在这个网站上还有其他比较两个日期的查询,这看起来很有效。有没有一种方法可以比较MySQL查询中的两个或三个日期,如果是新的则返回“是”,否则返回“否”?这将使我的PHP标记更简单。

    或者我是不是走错了路?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Daniel Vassallo    15 年前

    可以将表达式用作结果集中的附加字段:

    SELECT   ...
             (firstPostDate > lastViewDate OR lastPostDate > lastViewDate) AS unread
    FROM     posts;
    

    这个 unread 字段应该是 1 当线程是新的/有未读回复时,以及 0 否则。

    测试用例:

    CREATE TABLE posts (
        id int, 
        firstPostDate timestamp, 
        lastPostDate timestamp, 
        lastViewDate timestamp
    );
    
    INSERT INTO posts VALUES (1, '2010-01-01 12:00', '2010-01-02 12:00', '2010-01-03 12:00');
    INSERT INTO posts VALUES (2, '2010-01-03 12:00', '2010-01-05 12:00', '2010-01-04 12:00');
    INSERT INTO posts VALUES (3, '2010-01-06 12:00', '2010-01-06 12:00', '0000-00-00 00:00');
    INSERT INTO posts VALUES (4, '2010-01-07 12:00', '2010-01-07 12:00', '2010-01-08 12:00');
    

    结果:

    SELECT   id,
             (firstPostDate > lastViewDate OR lastPostDate > lastViewDate) AS unread
    FROM     posts;
    
    +------+--------+
    | id   | unread |
    +------+--------+
    |    1 |      0 |
    |    2 |      1 |
    |    3 |      1 |
    |    4 |      0 |
    +------+--------+
    4 rows in set (0.01 sec)
    
    推荐文章