如何以当天为搜索点获取同月前几周的数据

Posted

技术标签:

【中文标题】如何以当天为搜索点获取同月前几周的数据【英文标题】:How to get the data of previous weeks in the same month knowing the day as a search point 【发布时间】:2015-10-11 12:00:27 【问题描述】:

如何在知道日期的情况下获得该月的前一周。

例如,如果我有这样的表:

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 这样的日期(在第二周) 我想在同一个月获得前几周的结果。 所以在这个例子中,我想要 10 月第一周的结果是这样的:

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

【问题讨论】:

"现在每个月有4个星期" ???我不明白你的问题。你能详细说明一下所说的月份是什么意思吗? 如果一周中有一半在 9 月,一半在 10 月怎么办?您想要整周的数据,还是只需要 10 月份的一周中的部分数据? 我的意思是如果我在第二周有一个像11-10-2015 这样的日期现在我想要同一个月前几周表中的所有数据。我想在同一个月获取所有前几周的数据 @Aleksa:同一个月的一周中的一部分或只是Oct 【参考方案1】:

如果我对您的问题的理解正确,那么对于 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 可以替换为变量或任意单个日期。

【讨论】:

【参考方案2】:

我没有在 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

【讨论】:

这看起来很像 SQL Server 语法。您能否验证这应该在 Informix 中工作?

以上是关于如何以当天为搜索点获取同月前几周的数据的主要内容,如果未能解决你的问题,请参考以下文章

js实现获取当前时间是本月第几周和年的第几周的方法

java 获取iso 标准的日期的第几周

获取当天是本月的第几周

SQL SERVER查询时间是一年中第几周的函数

mysql获取指定日期是当年第几周,指定日期所在周的开始和结束日期

如何计算当前日期是当年的第几周