【问题标题】:I have a table which contains data with a date column. Mysql Query help needed!我有一个表,其中包含带有日期列的数据。需要mysql查询帮助!
【发布时间】:2011-06-01 06:45:54
【问题描述】:

现在,我在列中使用 php 时间戳 (time()) 作为时间戳。我使用它是因为我认为将它存储为整数比使用日期时间更有效。

现在我在选择两个时间戳之间的时间时遇到了严重的问题。

例如,我正在尝试获取昨天添加的记录(即在 php 时间戳中的今天日期和 todaysdate - php 时间戳中的 24 小时之间)

在sql伪代码中是这样的

SELECT * FROM table 
WHERE date < phptimestamp(todaysdate) AND date > phptimestamp(todaysdate -24h)

它确实给我带来了一些记录,但由于某种原因,此范围之间的记录不断变化。我正在查看的时间戳是静态的。这些时间戳之间的记录不应更改,因为添加的所有记录都有当前时间戳。

真实代码

$date = getdate();

$m = time() - (5 * 60);
$h = time() - (($date['minutes'] * 60) + $date['seconds']);
$d = time() - ((60 * 60 * $date['hours']) + ($date['minutes'] * 60) + $date['seconds']);
$y = time() - ((60 * 60 * 24) + ($date['hours'] * 60 * 60) + ($date['minutes'] * 60) + $date['seconds']);

$crawledm = mysql_fetch_assoc(mysql_query("SELECT count(crawled) as count FROM domains WHERE crawled != '' AND crawled > '{$m}'"));
$crawledm = $crawledm['count'];
$crawledh = mysql_fetch_assoc(mysql_query("SELECT count(crawled) as count FROM domains WHERE crawled != '' AND crawled > '{$h}'"));
$crawledh = $crawledh['count'];
$crawledd = mysql_fetch_assoc(mysql_query("SELECT count(crawled) as count FROM domains WHERE crawled != '' AND crawled > '{$d}'"));
$crawledd = $crawledd['count'];
$crawledy = mysql_fetch_assoc(mysql_query("SELECT count(crawled) as count FROM domains WHERE crawled != '' AND crawled > '{$y}' AND crawled < '{$d}'"));
$crawledy = $crawledy['count'];

【问题讨论】:

  • 需要更多代码来全面分析(PHP 调用这个 mysql 等...)...真实代码比伪代码好 10 倍。

标签: php sql mysql select date


【解决方案1】:

将 phptimestamp 替换为 FROM_UNIXTIME 以将整数转换为实际时间戳。这应该使您能够比较实际日期而不仅仅是整数。

【讨论】:

  • 我在表中使用了phptimestamp,这就是问题
【解决方案2】:

我假设您在表中使用 TIMESTAMP 列类型,而不是 UNIX 时间戳(它只是一个整数)。

没有理由将日期时间存储为整数 - MySQL(和所有其他 dbms)经过优化,可以以非常智能的方式处理日期和时间。

假设您将日期存储在日期时间/时间戳列中,您应该能够使用此查询:

SELECT *
FROM `table`
WHERE `date` BETWEEN DATE_SUB(NOW(), INTERVAL 1 DAY) AND NOW()

此外,当您在 MySQL 中处理日期和时间时,this doc page 是您的朋友。

【讨论】:

  • 我个人建议更改它。否则,您可以按照 alexn 的建议,在 FROM_UNIXTIME 中包含对您的 unix 时间戳列的每个引用。
  • 你能不能给我查询一下。我知道这可能要求太多,所以您不必这样做。
  • 您应该能够将我的示例中的表/列名替换为您的表名。为了给你准确的查询,我需要知道你的表的结构(你还没有指定你的时间戳列的数据类型,我猜它是“抓取的”)。根据您更新的帖子,我假设它是一个存储 unix 时间戳的整数?如果是这样,我建议根据我在上面的回答更改其数据类型。
  • -->>table ->domains -->>Columns ->domain (varchar), crawled (int)
猜你喜欢
  • 1970-01-01
  • 2016-09-13
  • 2011-06-30
  • 1970-01-01
  • 2011-04-18
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多