0

我需要从本周获取所有记录。但由于 2012 年 12 月 31 日星期一是 2012 年,mysql 将其视为第 53 周,而不是 2013 年的第 1 周。我该如何解决这个问题?

询问:

SELECT COUNT(*) AS `cnt`
FROM `orders`
WHERE WEEK(`date_purchased`, 1) = WEEK(NOW(), 1)
    AND (
           (
            MONTH(`date_purchased`) = MONTH(NOW() - INTERVAL 1 WEEK)
            AND YEAR(`date_purchased`) = YEAR(NOW() - INTERVAL 1 WEEK)
            )
        OR (
            MONTH(`date_purchased`) = MONTH(NOW())
            AND YEAR(`date_purchased`) = YEAR(NOW())
            )
        )
4

4 回答 4

2

根据ISO 标准,一年中的第 1 周是起始年中大部分天数的第一周,而week(date,1)为“2012-12-31”返回第 53 周,或者根据此week(date,3)等值weekofyear(date)正确返回周数标准,所以:

weekofyear('2013-01-01') = weekofyear('2012-12-31') = 1
-- week starts on Monday, and 2012-12-31 is part of the first week of 2013

weekofyear('2012-01-01') = weekofyear('2011-12-31') = 52
-- last week of 2011 starts on 12-26, first week of 2012 starts on 01-02

weekofyear('2010-01-01') = weekofyear('2009-12-31') = 53
-- some years have 53 weeks

weekofyear('2007-01-01') != weekofyear('2006-12-31')
-- that's correct because the first day of 2007 was a Monday

由于您的要求更具体,如果您必须检查两天是否属于同一年的同一周,这仍然不足以回答您的问题。

与其使用week, 或weekofyear, 不如使用yearweek(date,mode)函数 using mode=3, 它返回与上述相同的周数, 但也可以在本周之前加上年份:

yearweek('2013-01-01', 3) = yearweek('2012-12-31', 3) = 201301
yearweek('2012-01-01', 3) = yearweek('2011-12-31', 3) = 201152
yearweek('2010-01-01', 3) = yearweek('2009-12-31', 3) = 200952
yearweek('2007-01-01', 3) != yearweek('2006-12-31', 3)

所以你的查询可能变成:

SELECT COUNT(*) AS `cnt`
FROM `orders`
WHERE YEARWEEK(`date_purchased`, 3) = YEARWEEK(DATE(), 3)
于 2013-01-07T06:56:30.440 回答
0

采用

SELECT COUNT(*) AS `cnt`
    FROM `orders`
    WHERE SUBDATE(CURDATE(), WEEKDAY(CURDATE())) <= `date_purchased`
        AND `date_purchased` < ADDDATE(CURDATE(), 7 - WEEKDAY(CURDATE()));
于 2013-01-07T07:05:14.700 回答
0

您是否尝试过使用 yearweek()?

yearweek('2012-12-31',1) 和 yearweek('2013-01-01',1) 都给出相同的结果。

计算 yearweek 有不同的方法,这就是参数“1”的意义所在。有关完整列表,请参阅http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_week

于 2013-01-08T15:51:55.750 回答
-1

我有一个非常相似但也有点不同的问题/问题(当然,除非我误解了他的问题)。

我还必须列出本周的所有内容(在我的情况下,这是将在电影院放映的电影)。

但是在我的情况下,我需要它,例如,如果您有电影要在 2013 年 12 月 30 日、2013 年 12 月 31 日和 2014 年 1 月 2 日放映,并且您处于 2013 年的一周中,则可以观看所有电影本周(甚至那些将在 2014 年放映的电影)以及当您在 2014 年的部分时间再次观看所有电影时(甚至是那些在 2013 年放映的电影)。

不必手动指定每年的周数,也不必手动指定年份,因为我当然需要它每年工作而无需修改代码。

这是我当前的 SQL 查询:

SELECT * FROM #__cinema_dates AS d LEFT JOIN #__cinema_film AS f on d.fid=f.id WHERE WEEK(d.date) = WEEK(CURDATE()) ORDER BY d.date ASC
于 2013-11-26T13:40:12.077 回答