"Shaun" <[EMAIL PROTECTED]> wrote on 12/02/2005 10:09:44 AM:

> Hi,
> 
> I am having a problem with using dates grouped by week where it spans 
over 2 
> months. I would like the query to return all hours worked by week 
number, 
> however week 48 is causing problems because it spans 2 months - actually 
I 
> am presuming this is the problem!
> 
> mysql> SELECT DATE_FORMAT(T.Date, '%x-%v-%m') AS 'YearWeek', T.Status, 
> U.User_ID,  U.User_Firstname,  U.User_Lastname,  SUM(T.Hours) AS 
Total_Hours 
> FROM Users U, Timesheets T WHERE T.User_ID = U.User_ID  AND U.User_ID = 
1 
> GROUP BY YearWeek, T.User_ID ORDER BY YearWeek DESC;
> +------------+------------+---------+----------------
> +---------------+-------------+
> | YearWeek   | Status     | User_ID | User_Firstname | User_Lastname | 
> Total_Hours |
> +------------+------------+---------+----------------
> +---------------+-------------+
> | 2005-48-12 | Open       |       1 | Shaun          | x    | 14.75 |
> | 2005-48-11 | Open       |       1 | Shaun          | x    | 23.5 |
> | 2005-47-11 | Unapproved |       1 | Shaun          | x    | 20.75 |
> +------------+------------+---------+----------------
> +---------------+-------------+
> 3 rows in set (0.00 sec)
> 
> mysql> DESC Timesheets;
> 
+-------------------+-------------+------+-----+------------+----------------+
> | Field             | Type        | Null | Key | Default    | Extra 
> |
> 
+-------------------+-------------+------+-----+------------+----------------+
> | Timesheet_ID      | int(11)     |      | PRI | NULL       | 
auto_increment 
> |
> | Type              | varchar(40) | YES  |     | NULL       | 
> |
> | Project_ID        | int(11)     | YES  |     | NULL       | 
> |
> | Unavailability_ID | int(11)     | YES  |     | NULL       | 
> |
> | User_ID           | int(11)     |      |     | 0          | 
> |
> | Hours             | float       |      |     | 0          | 
> |
> | Date              | date        |      |     | 0000-00-00 | 
> |
> | Status            | varchar(40) | YES  |     | Open       | 
> |
> 
+-------------------+-------------+------+-----+------------+----------------+
> 8 rows in set (0.00 sec)
> 
> mysql> SELECT * FROM Timesheets WHERE User_ID = 1;
> +--------------+---------+------------+-------------------+---------
> +-------+------------+------------+
> | Timesheet_ID | Type    | Project_ID | Unavailability_ID | User_ID | 
Hours 
> | Date       | Status     |
> +--------------+---------+------------+-------------------+---------
> +-------+------------+------------+
> |            9 | Project |         71 |              NULL |       1 | 
8.25 
> | 2005-11-25 | Unapproved |
> |           10 | Project |         71 |              NULL |       1 | 
4.5 
> | 2005-11-26 | Unapproved |
> |           11 | Project |         66 |              NULL |       1 |  8 

> | 2005-11-24 | Unapproved |
> |           54 | Project |         66 |              NULL |       1 | 
4.75 
> | 2005-11-28 | Open       |
> |           53 | Project |         67 |              NULL |       1 | 
7.5 
> | 2005-12-02 | Open       |
> |           52 | Project |         67 |              NULL |       1 | 
7.25 
> | 2005-12-01 | Open       |
> |           51 | Project |         67 |              NULL |       1 | 10 

> | 2005-11-30 | Open       |
> |           50 | Project |         67 |              NULL |       1 | 
6.25 
> | 2005-11-29 | Open       |
> |           55 | Project |         66 |              NULL |       1 | 
2.5 
> | 2005-11-29 | Open       |
> +--------------+---------+------------+-------------------+---------
> +-------+------------+------------+
> 9 rows in set (0.00 sec)
> 
> mysql>
> 
> Any ideas? 
> 
> 
You are correct, this function: DATE_FORMAT(T.Date, '%x-%v-%m') is 
returning a second value for 2005-48 exactly because it spans two months. 
I think if you just simplified your format string to '%x-%v' you will get 
the behavior you want. Here is how I would rewrite it:

SELECT DATE_FORMAT(T.Date, '%x-%v') AS 'YearWeek'
  , GROUP_CONCAT(month(t.Date)) as 'Month(s)'
  , T.Status
  , U.User_ID
  , U.User_Firstname
  , U.User_Lastname
  , SUM(T.Hours) AS Total_Hours 
FROM Users U
INNER JOIN Timesheets T 
  ON T.User_ID = U.User_ID
  AND U.User_ID = 1 
GROUP BY YearWeek, T.User_ID 
ORDER BY YearWeek DESC;

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine

Reply via email to