MySQL选择昨天的日期


101

如何显示和计算日期为昨天的值?我曾经time()在数据库中插入日期。例:

URL: google.com youtube.com google.com youtube.com test.com youtube.com
DateVisited: 1313668492 1313668540 1313668571 13154314

我想显示表中存在多少个具有多个URL的URL,以及昨天有多少个URL被访问过。结果示例:

LINK       | timesExisted | timesVisitedYesterday
Google.com |       2      | 2
youtube.com|       3      | 3

我已经有了获取昨天日期的想法,但是我没有一个想法来计算昨天存在一个URL的次数和计算表中存在URL的次数。

Answers:


165

获取昨天日期的最简单最佳方法是:

subdate(current_date, 1)

您的查询将是:

SELECT 
    url as LINK,
    count(*) as timesExisted,
    sum(DateVisited between UNIX_TIMESTAMP(subdate(current_date, 1)) and
        UNIX_TIMESTAMP(current_date)) as timesVisitedYesterday
FROM mytable
GROUP BY 1

出于好奇,sum(condition)给您提供满足条件的行的原因(否则将需要繁琐且冗长的case语句)是因为在mysql中,布尔值是1true还是0false,因此对条件求和有效地计算了多少次这是真的。使用此模式可以整理您的SQL代码。


89
SELECT SUBDATE(NOW(),1);

now()函数在时间戳中返回系统的当前日期和时间...

您可以使用:

SELECT SUBDATE(CURDATE(),1)

3
为我工作。非常感谢
Mable George

20

您可以使用:

SELECT SUBDATE(NOW(), 1);

要么

SELECT SUBDATE(NOW(), INTERVAL 1 DAY);

要么

SELECT NOW() - INTERVAL 1 DAY;

要么

SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);

11

您可以使用表达式获取昨天的日期CAST(NOW() - INTERVAL 1 DAY AS DATE)。所以这样的事情可能会起作用:

SELECT * FROM your_table

WHERE DateVisited >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND DateVisited <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));

9

查询最近几周:

SELECT *
FROM dual
WHERE search_date BETWEEN SUBDATE(CURDATE(), 7) AND CURDATE()

9

最后或下一个日期,星期,月份和年份的计算。这可能对任何人都有帮助。

当前日期:

select curdate();

昨天:

select subdate(curdate(), 1)

明天:

select adddate(curdate(), 1)

最近1周:

select between subdate(curdate(), 7) and subdate(curdate(), 1)

接下来的1周:

between adddate(curdate(), 7) and adddate(curdate(), 1)

最近1个月:

between subdate(curdate(), 30) and subdate(curdate(), 1)

接下来的1个月:

between adddate(curdate(), 30) and adddate(curdate(), 1)

这个月:

subdate(curdate(),day(curdate())-1) and last_day(curdate());

最近1年:

between subdate(curdate(), 365) and subdate(curdate(), 1)

接下来的1年:

between adddate(curdate(), 365) and adddate(curdate(), 1)

7

尽管选择的答案是正确且更加简洁的,但我还是会为其他答案中指出的结构辩护:

SELECT * FROM your_table
WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));

如果您只需要一个没有时间戳的空档,也可以将其编写为以下内容:

SELECT * FROM your_table
WHERE DateVisited >= CAST(NOW() - INTERVAL 1 DAY AS DATE)
  AND DateVisited <= CAST(NOW() AS DATE);

之所以使用CASTSUBDATEIS CAST是ANSI SQL语法。 SUBDATE是的日期算术组件的MySQL特定实现CAST。如果必须迁移到其他数据库,养成使用ANSI语法的习惯可以减少麻烦。养成专业实践的习惯也是很好的,因为将来您几乎肯定会与其他DBMS一起工作。

没有一个主要的DBMS系统完全兼容ANSI,但是它们中的大多数都实现了广泛的ANSI语法集,而在MySQL及其后代(MariaDB,Percona等)之外,几乎没有一个将实现MySQL特定的语法。


关于为什么一个人会选择一个而不是另一个的很好的解释。
Sablefoste

4

我改用了cdhowie的上述答案之一,因为我无法使它起作用。这似乎对我有用。我怀疑使用UNIX_TIMESTAMP函数也可以做到这一点。

SELECT * FROM your_table

WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.