当日期保存为UNIX时间戳时,MySQL筛选特定日期

时间:2017-12-22 12:23:26

标签: php mysql database date timestamp

我正在使用PHP访问MySQL数据库。我有一个像这样建立的表:

表标题:

  • id(INT,自动增量),profileid,timestamp

表格内容:

  • 1,12345678,1513814399(= 12/21/2017)
  • 2,13451983,1513814400(= 12/21/2017)
  • 3,12345678,1513944000(= 12/22/2017)
  • 4,12345678,1513944001(= 12/22/2017)

该表显示了网站访问者此时调用的个人资料。

所以现在我的问题是,如何展示例如:  “请给我12/22/2017号调用的配置文件号码12345678的条目数量”,在这种情况下为“2”。

我尝试了这个查询:

SELECT COUNT(profileid), from_unixtime(timestamp, '%d') AS day, from_unixtime(timestamp, '%m') as month, from_unixtime(timestamp, '%Y') as year WHERE profileid='12345678' AND day=22 AND month=12 AND year=2017;

但是无法访问“day”,“month”和“year”列,因为它们不存在于表中。

有人可以给我一个提示怎么做?另一种方法是创建三个新列(timestamp_day,timestamp_month和timestamp_year),但这不是一个很好的解决方案。

提前谢谢!

TEHA

3 个答案:

答案 0 :(得分:3)

只需生成日期。我想你想要:

SELECT COUNT(profileid)
FROM t
WHERE DATE(from_unixtime(timestamp)) = '2017-12-22' AND
      profileid = '12345678';

我更倾向于将其写成:

SELECT COUNT(profileid)
FROM t
WHERE profileid = '12345678' AND
      timestamp >= UNIX_TIMESTAMP('2017-12-22') AND
      timestamp < UNIX_TIMETAMP('2017-12-23');

这允许查询充分利用t(profileid, timestamp)上的索引。

答案 1 :(得分:0)

您可以将MySQL DAYMONTHYEAR功能与FROM_UNIXTIME结合使用。

SELECT COUNT(profileid)
WHERE profileid='12345678'
AND DAY(FROM_UNIXTIME(timestamp))=22
AND MONTH(FROM_UNIXTIME(timestamp))=12
AND YEAR(FROM_UNIXTIME(timestamp))=2017;

答案 2 :(得分:0)

这里有一些事情。

  1. 您可以使用TIMESTAMP将原始时间戳转换为MySQL FROM_UNIXTIME(timestamp)对象。你已经知道了。
  2. 获得TIMESTAMP后,您可以使用各种日期函数。
  3. 您可以使用UNIX_TIMESTAMP()
  4. 转换其他方向
  5. 当您查找一天的记录时,您可以进行日期范围搜索。
  6. 所以你的查询应该是

       SELECT COUNT(*) cnt
         FROM t
        WHERE profileid = '12345678'
          AND timestamp >= UNIX_TIMESTAMP('2017-12-22')
          AND timestamp <  UNIX_TIMESTAMP('2017-12-23')
    

    这将在您想要的那天获取每个时间戳值,但不包括第二天的午夜。如果您在(profileid, timestamp)上有索引,则此类查询会很快。

    注意你也可以

       SELECT COUNT(*) cnt, profileid
         FROM t
        WHERE timestamp >= UNIX_TIMESTAMP('2017-12-22')
          AND timestamp <  UNIX_TIMESTAMP('2017-12-23')
        GROUP BY profileid
    

    并获得一个结果集,显示当天所有个人资料ID的计数。而且,你可以做到

       SELECT COUNT(*) cnt, profileid, DATE(FROM_UNIXTIME(timestamp)) day
         FROM t
        WHERE timestamp >= UNIX_TIMESTAMP('2017-11-01')
          AND timestamp <  UNIX_TIMESTAMP('2017-12-01')
        GROUP BY profileid, DATE(FROM_UNIXTIME(timestamp))
    

    并获得11月的一切。

    你可以这样做

       SELECT COUNT(*) cnt, profileid, LAST_DAY(FROM_UNIXTIME(timestamp)) month_ending
         FROM t
        WHERE timestamp >= UNIX_TIMESTAMP('2017-01-01')
          AND timestamp <  UNIX_TIMESTAMP('2018-01-01')
        GROUP BY profileid, LAST_DAY(FROM_UNIXTIME(timestamp))
    

    并获得一整年的逐月摘要。

    日期算术很有用。这就是为什么许多表设计使用类似DATETIMETIMESTAMP的实际类似日期戳的字段,而不是原始整数时间戳。