以当天为搜索点如何获取同月前几周的数据
How to get the data of previous weeks in the same month knowing the day as a search point
如何知道该月的前一周。
例如,如果我 table 是这样的:
emp_num trans_date
22 1-10-2015
22 5-10-2015
22 7-10-2015
22 11-10-2015
22 14-10-2015
22 19-10-2015
22 27-10-2015
现在每个月有 4 周。
所以我有一个像 11-10-2015
这样的约会(在第二周)
我想获得同月所有前几周的结果。
所以在这个例子中我想要十月第一周的结果是这样的:
emp_num trans_date
22 1-10-2015
22 5-10-2015
22 7-10-2015
注:
The start day of the week is: sat
The end day of the week is:Fri
我没有在 informix 工作过,但在 SQL 中是这样的:
DECLARE @SomeDate DATE
SET @SomeDate = '2015-10-11'
DECLARE @DayOfWeek INT
SELECT @DayOfWeek = ((DATEPART(dw, @SomeDate) ) % 7)
DECLARE @WeekStart DATE
SELECT @WeekStart = DATEADD(d, -@DayOfWeek, @SomeDate)
SELECT * FROM SomeTable
WHERE MONTH(trans_date) = MONTH(@SomeDate) AND trans_date < @WeekStart
如果我对你的问题的理解正确,对于 2015 年 10 月,你预计会出现以下结果:
RunDate Weekday Result
01-10-2015 Thurs [nothing]
02-10-2015 Fri [nothing]
03-10-2015 Sat 01-10-2015, 02-10-2015
04-10-2015 Sun 01-10-2015, 02-10-2015 (same as above)
...
09-10-2015 Fri 01-10-2015, 02-10-2015 (same as above)
10-10-2015 Sat 01-10-2015, ... , 09-10-2015
...
16-10-2015 Fri 01-10-2015, ... , 09-10-2015 (same as above)
17-10-2015 Sat 01-10-2015, ... , 16-10-2015
20-10-2015 Tue 01-10-2015, ... , 16-10-2015 (same as above)
30-10-2015 Fri 01-10-2015, ... , 23-10-2015
31-10-2015 Sat 01-10-2015, ... , 30-10-2015
如果是这种情况,那么以下查询将执行您的要求:
SELECT trans_date, emp_num, COUNT(1)
FROM transaction_table
WHERE MONTH(trans_date) = MONTH(TODAY)
AND YEAR(trans_date) = YEAR(TODAY)
AND trans_date <= DECODE(WEEKDAY(TODAY),
6, TODAY -1,
TODAY - WEEKDAY(TODAY) -2)
GROUP BY 1, 2
ORDER BY 1, 2
DECODE()
中的逻辑是管理与 WEEKDAY()
默认行为的偏移量,其中 Sun => 0 和 Sat => 6。关键字 TODAY
在上面的查询可以替换为变量或任意单个日期。
如何知道该月的前一周。
例如,如果我 table 是这样的:
emp_num trans_date
22 1-10-2015
22 5-10-2015
22 7-10-2015
22 11-10-2015
22 14-10-2015
22 19-10-2015
22 27-10-2015
现在每个月有 4 周。
所以我有一个像 11-10-2015
这样的约会(在第二周)
我想获得同月所有前几周的结果。
所以在这个例子中我想要十月第一周的结果是这样的:
emp_num trans_date
22 1-10-2015
22 5-10-2015
22 7-10-2015
注:
The start day of the week is: sat The end day of the week is:Fri
我没有在 informix 工作过,但在 SQL 中是这样的:
DECLARE @SomeDate DATE
SET @SomeDate = '2015-10-11'
DECLARE @DayOfWeek INT
SELECT @DayOfWeek = ((DATEPART(dw, @SomeDate) ) % 7)
DECLARE @WeekStart DATE
SELECT @WeekStart = DATEADD(d, -@DayOfWeek, @SomeDate)
SELECT * FROM SomeTable
WHERE MONTH(trans_date) = MONTH(@SomeDate) AND trans_date < @WeekStart
如果我对你的问题的理解正确,对于 2015 年 10 月,你预计会出现以下结果:
RunDate Weekday Result
01-10-2015 Thurs [nothing]
02-10-2015 Fri [nothing]
03-10-2015 Sat 01-10-2015, 02-10-2015
04-10-2015 Sun 01-10-2015, 02-10-2015 (same as above)
...
09-10-2015 Fri 01-10-2015, 02-10-2015 (same as above)
10-10-2015 Sat 01-10-2015, ... , 09-10-2015
...
16-10-2015 Fri 01-10-2015, ... , 09-10-2015 (same as above)
17-10-2015 Sat 01-10-2015, ... , 16-10-2015
20-10-2015 Tue 01-10-2015, ... , 16-10-2015 (same as above)
30-10-2015 Fri 01-10-2015, ... , 23-10-2015
31-10-2015 Sat 01-10-2015, ... , 30-10-2015
如果是这种情况,那么以下查询将执行您的要求:
SELECT trans_date, emp_num, COUNT(1)
FROM transaction_table
WHERE MONTH(trans_date) = MONTH(TODAY)
AND YEAR(trans_date) = YEAR(TODAY)
AND trans_date <= DECODE(WEEKDAY(TODAY),
6, TODAY -1,
TODAY - WEEKDAY(TODAY) -2)
GROUP BY 1, 2
ORDER BY 1, 2
DECODE()
中的逻辑是管理与 WEEKDAY()
默认行为的偏移量,其中 Sun => 0 和 Sat => 6。关键字 TODAY
在上面的查询可以替换为变量或任意单个日期。