根据日期从数据库中获取记录

时间:2014-02-05 05:32:53

标签: mysql sql

问题

我开发了一个游戏系统,用户可以在其中执行一定数量的活动,并且他们需要使用小工具。他们被允许在游戏中间更换他们的小工具。例如,用户从一开始就使用 XBox 2013年11月29日)直到 2014年2月3日,现在他决定转换他的小工具 Wii 然后从我的数据库中我想根据日期为XBox和Wii获取该用户的数据。

我使用以下查询,数据库中有数据,但查询结果仍为Zero记录。任何建议都会很棒!

查询

SELECT * 
FROM game_scores
WHERE username =  "joe@example.com"
AND gadget_data_type =  "Activity"
AND gadget_sub_data_type =  "running"
AND (
gadget_name =  "XBox"
AND STR_TO_DATE( date_time,  "%a, %e %b %Y %H:%i:%s" ) >= STR_TO_DATE(  "Fri, 29 Nov 2013 00:00:00",  "%a, %e %b %Y %H:%i:%s" )
)
AND (
gadget_name =  "Wii"
AND STR_TO_DATE( date_time,  "%a, %e %b %Y %H:%i:%s" ) >= STR_TO_DATE(  "Mon, 3 Feb 2014 00:04:46",  "%a, %e %b %Y %H:%i:%s" )
)
ORDER BY df_id DESC

2 个答案:

答案 0 :(得分:1)

如果您正在进行一系列连续日期,则无需使用IN运算符。

如果你用它来计算七天前的午夜

DATE(NOW()) - INTERVAL 7 DAY + INTERVAL 0 SECOND

这是你得到的:

mysql> SELECT DATE(NOW()) - INTERVAL 7 DAY + INTERVAL 0 SECOND;
+--------------------------------------------------+
| DATE(NOW()) - INTERVAL 7 DAY + INTERVAL 0 SECOND |
+--------------------------------------------------+
| 2012-11-21 00:00:00                              |
+--------------------------------------------------+

1 row in set (0.01 sec)


mysql>
Your query will look like this:

SELECT COUNT(DISTINCT `user`) FROM `tracks`
WHERE `track_time` >= ( DATE(NOW()) - INTERVAL 7 DAY + INTERVAL 0 SECOND );
You also need an index to support the WHERE and COUNT

ALTER TABLE tracks ADD INDEX track_time_user_ndx (track_time,user);

然后,查询应该更快。

如果您正在进行一些较早期间的连续日期,只需提供从午夜到午夜的第一个和最后一个日期。例如,对于2012-11-12到2012-11-19的范围:

SELECT COUNT(DISTINCT `user`) FROM `tracks`
WHERE `track_time` >= '2012-11-12 00:00:00'
AND   `track_time` <  '2012-11-19 00:00:00';
If you are doing a range of non-consecutive dates, simply structure the query using UNION. For example, for dates 2012-11-12,2012-11-19,2012-11-26:

SELECT COUNT(DISTINCT `user`) FROM
(
    SELECT user,track_time FROM `tracks`
    WHERE `track_time` >= '2012-11-12 00:00:00'
    AND   `track_time` <= '2012-11-12 23:59:59'
    UNION
    SELECT user,track_time FROM `tracks`
    WHERE `track_time` >= '2012-11-19 00:00:00'
    AND   `track_time` <= '2012-11-19 23:59:59'
    UNION
    SELECT user,track_time FROM `tracks`
    WHERE `track_time` >= '2012-11-26 00:00:00'
    AND   `track_time` <= '2012-11-26 23:59:59'
) 

答案 1 :(得分:0)

应用“或”黑白小工具类型和日期

AND Opertaor

AND运算符根据满足多个要求的要求选择行

OR opearator

“要么是”,要么是“接近。

由于这两个条件,你正在申请同一列,那么它们永远不会同时满足。

简单的手段,举一个例子

col1  col2

a   1
a   2
b   3

所以(col1 = a和col2 = 1)和(col1 = b和col2 = 3)永远不会给你任何记录。

b / c表示col1的值为a,col2的值为2,col1的值为b,col2的值为3。

它只是意味着在同一列上添加和运算符,不会产生结果。

简单的例子。

是不可能的
 col1=a and col1=b