1

我希望在Oracle(具体来说是 Web Intelligence)中创建一个查询,该查询根据当前周数选择记录。我使用的是 ISO 标准,所以格式是"IW"。我知道这是一个不寻常的请求(基于week#进行查询,而不是作为week #格式返回),但是我在公共卫生部门工作,根据当前的流行病学周查询数据是一种常见的做法。在这种情况下,我用 epi 周代替 ISO 标准。

在伪代码中,它看起来像这样:

 SELECT * FROM * WHERE date BETWEEN *WEEK#ONE* AND *CURRENTWEEK#*

WEEK#ONE将是 1-52 之间的一个数字,比CURRENTWEEK#当前 ISO 周数小 3。

到目前为止,我已经开始涉足to_date('01', 'IW')作为一个例子,但我只是不断遇到障碍。任何帮助将非常感激 :)

4

2 回答 2

4

您可以创建一个函数来将年份和 ISO 周数转换为日期:

SQL小提琴

CREATE FUNCTION TO_ISO_WEEK_DATE(
  week NUMBER,
  year NUMBER
) RETURN DATE DETERMINISTIC
IS
BEGIN
  RETURN NEXT_DAY(
          TO_DATE( year || '0104', 'YYYYMMDD' )
            - INTERVAL '7' DAY, 'MONDAY'
         )
         + ( week - 1 ) * 7;
END TO_ISO_WEEK_DATE;
/

查询 1

SELECT LEVEL AS week,
       TO_ISO_WEEK_DATE( LEVEL, 2013 ) AS "date",
       TO_CHAR( TO_ISO_WEEK_DATE( LEVEL, 2013 ), 'IW' ) AS "Check"
FROM   DUAL
CONNECT BY LEVEL <= 5

结果

| WEEK |                            DATE | CHECK |
|------|---------------------------------|-------|
|    1 | December, 31 2012 00:00:00+0000 |    01 |
|    2 |  January, 07 2013 00:00:00+0000 |    02 |
|    3 |  January, 14 2013 00:00:00+0000 |    03 |
|    4 |  January, 21 2013 00:00:00+0000 |    04 |
|    5 |  January, 28 2013 00:00:00+0000 |    05 |

然后,您可以使用此功能来确定您在哪些日期之间进行搜索:

SELECT *
FROM   tbl
WHERE  "date" BETWEEN TO_ISO_WEEK_DATE( :currentweek - 3, 2014 )
              AND     TO_ISO_WEEK_DATE( :currentweek, 2014 );

如果您想在没有函数的情况下执行此操作,则可以在函数中解包代码:

SELECT *
FROM   tbl
WHERE  "date" BETWEEN NEXT_DAY( TO_DATE( :currentyear || '0104', 'YYYYMMDD' ) - INTERVAL '7' DAY, 'MONDAY' ) + ( :currentweek - 4 ) * 7
              AND     NEXT_DAY( TO_DATE( :currentyear || '0104', 'YYYYMMDD' ) - INTERVAL '7' DAY, 'MONDAY' ) + ( :currentweek - 1 ) * 7;
于 2014-01-06T21:27:55.070 回答
1

这是你想要的?

WHERE to_char(date, 'YYYY-IW') BETWEEN to_char(sysdate - 21, 'YYYY-IW') AND
                                       to_char(sysdate, 'YYYY-IW')
于 2014-01-06T21:27:34.850 回答