我希望在 Oracle(特定于Web Intelligence)中创建一个查询,该查询根据当前周数选择记录。我正在使用ISO标准,因此格式为“IW”。我知道这是一个不寻常的请求(基于周#进行查询。与返回week #
格式相比),但是我在公共卫生部门工作,这是一种常见的做法。查询基于当前流行病学周的数据。在这种情况下,我用epi周代替ISO标准。
在伪代码中,它看起来像这样:
SELECT * FROM * WHERE date BETWEEN *WEEK#ONE* AND *CURRENTWEEK#*
WEEK#ONE
将是1-52之间的数字,比CURRENTWEEK#
小3,这是当前的ISO周数。
到目前为止,我已经开始涉足to_date('01', 'IW')
作为一个例子,但我只是继续打路障。任何帮助将非常感激:)
答案 0 :(得分:4)
您可以创建一个功能,将年份和ISO周数转换为日期:
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
<强> Results 强>:
| 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;
答案 1 :(得分:1)
这是你在找什么?
WHERE to_char(date, 'YYYY-IW') BETWEEN to_char(sysdate - 21, 'YYYY-IW') AND
to_char(sysdate, 'YYYY-IW')