发布
社区首页 >问答首页 >选择两个日期之间的所有数据

选择两个日期之间的所有数据
EN

Stack Overflow用户
提问于 2010-08-03 11:05:35
回答 3查看 960关注 0票数 1

有必要为某些日期选择值,我知道如何做,但有一个问题无法解决。

我在MySQL中的表:

代码语言:javascript
代码运行次数:0
复制
[User]. [Wins]. [DATE]
#
Ivan ....... 4 ..... 05/06/2010
#
Ivan ....... 3 ..... 06/15/2010
#
Ivan ........ 6 ..... 06/18/2010
#
Ivan ........ 1 ..... 29/06/2010

问题是,如果用户没有访问该站点,则不会在数据库中创建行,并且会错过获得的日期。

如何获取统计数据(如Wins 0),例如从2010年6月6日到2010年6月14日这段时间?帮助进行这个查询。

EN

回答 3

Stack Overflow用户

发布于 2010-08-03 11:48:20

MySQL没有递归功能,因此只能使用NUMBERS表技巧-

  1. 创建一个只保存递增数字的表-使用auto_increment很容易做到:

DROP TABLE IF EXISTS examplenumbers;CREATE table examplenumbers( id int(10) unsigned NOT NULL auto_increment,PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT DEFAULT TABLE使用:

插入数字(id)值(NULL)

根据需要...for任意多个值。

  • 使用DATE_ADD构造日期列表,并根据NUMBERS.id值增加天数:

SELECT x.* FROM (SELECT DATE_FORMAT(‘2010-06-06’,INTERVAL n.id -1 DAY),'%m/%d/%Y') FROM numbers n WHERE DATE_ADD('2010-06-06',INTERVAL n.id -1 DAY) <= '2010-06-14 ) x

  • LEFT JOIN根据时间部分连接到您的数据表:

SELECT x.ts作为时间戳,COALESCE(COUNT(y.wins),0) AS cnt FROM (SELECT DATE_FORMAT(DATE_ADD('2010-06-06',INTERVAL n.id -1 DAY),'%m/%d/%Y') AS ts FROM numbers n WHERE DATE_ADD('2010-06-06',INTERVAL n.id -1 DAY) <= '2010-06-14') x在STR_TO_DATE(y.date,'%m/%d/%Y') = x.ts的x.ts组

票数 3
EN

Stack Overflow用户

发布于 2010-08-03 11:15:00

在“wins”字段上尝试“sum”聚合函数,并将其(使用where)限制为该特定日期范围(因此date<='6/14/2010‘和date>='06/06/2010')。

例如SELECT SUM(wins) FROM tbl_name WHERE DATE介于date1和date2之间

要获取每个日期范围内的获奖数量,请添加“group by user”,以便查看每个用户在该日期范围内的获奖数量。

票数 0
EN

Stack Overflow用户

发布于 2010-08-03 11:23:45

这里有一个我怀疑可以解决这个问题的答案。我创建了一个临时表,为您提供一个日期列表(我使用一个包含开始和结束日期的循环插入该列表。计数器必须从0开始,因为您希望包含开始日期本身)。

然后,我将DateList加入到Wins表中,为您提供该范围内的所有日期、用户及其在这些日期的访问的列表。我还没有测试它,但我怀疑它的代码接近于您所需要的。

代码语言:javascript
代码运行次数:0
复制
DECLARE Counter INT DEFAULT 0
DECLARE NumDays INT DEFAULT DATEDIFF(StartDate, EndDate)

CREATE TEMPORARY TABLE DateList
(
    [Date] DATETIME
)

WHILE Counter <= NumDays
    INSERT INTO DateList ([Date]) VALUES (DATE_ADD(StartDate, INTERVAL Counter Day))
    SET Counter = Counter + 1
END WHILE

SELECT
    [User]  
    ,COUNT(User) AS Wins
    ,DateList.[Date] AS [Date]
FROM
    DateList LEFT JOIN Wins ON Wins.[Date] = DateList.[Date]
WHERE
    DateList.[Date] BETWEEN StartDate AND EndDate
GROUP BY
    [User]
    ,DateList.[Date]
ORDER BY
    DateList.[Date]

编辑:我对我的连接和计数做了一些修改。我测试了MSSQL版本,它工作得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3393342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档