简体   繁体   English

将星期日期转换为日历日期

[英]Converting week date into calendar date

I have column with dates in format: 我有日期格式的列:

year/number_of_week_in_year/number_of_day_of_the_week, for example:

2015015 = 01.01.2015

How to write query which convert this date to RRRRmmdd format? 如何编写查询将此日期转换为RRRRmmdd格式?

I use Oracle 10g. 我使用Oracle 10g。

If you are using the ISO standard for weeks then you can do: 如果您使用ISO标准数周,则可以执行以下操作:

SQL Fiddle SQL小提琴

Oracle 11g R2 Schema Setup : Oracle 11g R2架构设置

CREATE FUNCTION TO_ISO_WEEK_DATE(
  year      NUMBER,
  week      NUMBER,
  dayofweek NUMBER DEFAULT 1
) RETURN DATE DETERMINISTIC
IS
BEGIN
  RETURN NEXT_DAY(
          TO_DATE( TO_CHAR( year, '0000' ) || '0104', 'YYYYMMDD' )
            - INTERVAL '7' DAY, 'MONDAY'
         )
         + ( week - 1 ) * 7
         + ( dayofweek - 1 );
EXCEPTION
  WHEN OTHERS THEN
    RETURN NULL;
END TO_ISO_WEEK_DATE;
/

Query 1 : 查询1

WITH dates (value ) AS (
  SELECT DATE '2015-01-01' + LEVEL - 1
  FROM   DUAL
  CONNECT BY LEVEL < 366
),
data ( value, iso_week_day ) AS (
  SELECT value,
         TO_CHAR( value, 'IYYY/IW/' ) || TO_CHAR( value - TRUNC( value, 'IW' ) + 1 )
  FROM   dates
)
SELECT value,
       iso_week_day,
       TO_ISO_WEEK_DATE(
         SUBSTR( iso_week_day, 1, 4 ),
         SUBSTR( iso_week_day, 6, 2 ),
         SUBSTR( iso_week_day, 9, 1 )
       ) AS CONVERTED_DATE
FROM data

Results : 结果

|                       VALUE | ISO_WEEK_DAY |              CONVERTED_DATE |
|-----------------------------|--------------|-----------------------------|
|   January, 01 2015 00:00:00 |    2015/01/4 |   January, 01 2015 00:00:00 |
|   January, 02 2015 00:00:00 |    2015/01/5 |   January, 02 2015 00:00:00 |
|   January, 03 2015 00:00:00 |    2015/01/6 |   January, 03 2015 00:00:00 |
|   January, 04 2015 00:00:00 |    2015/01/7 |   January, 04 2015 00:00:00 |
|   January, 05 2015 00:00:00 |    2015/02/1 |   January, 05 2015 00:00:00 |
   ...
|    August, 23 2015 00:00:00 |    2015/34/7 |    August, 23 2015 00:00:00 |
   ...
|  December, 30 2015 00:00:00 |    2015/53/3 |  December, 30 2015 00:00:00 |
|  December, 31 2015 00:00:00 |    2015/53/4 |  December, 31 2015 00:00:00 |

If I understand you right, this is what you want: 如果我理解正确,这就是您想要的:

SELECT TO_CHAR(NEXT_DAY(
NEXT_DAY( to_date('01.01.'||SUBSTR('2015015',1,4),'dd.mm.yyyy')-7,1) +      
(SUBSTR('2015015',5,2)-1)*7,TO_NUMBER(SUBSTR('2015015',7,1))),'rrrrmmdd')
FROM dual;

In case you're trying to reverse Oracle's yyyywwd format mask, the code below might be of use. 如果您尝试反向使用Oracle的yyyywwd格式掩码,则下面的代码可能有用。 However - it is not universal and depends on your NLS settings (names for days and which day is considered first day of week SUN/MON). 但是-它不是通用的,并且取决于您的NLS设置(日期的名称以及将哪一天视为星期日/星期一的第一天)。

It is strange though, that to_date() does not accept 'ww' as a format. 但是,奇怪的是to_date()不接受'ww'作为格式。

select dt,
       dt_ywd,
       next_day(to_date(substr(dt_ywd,1,4)||'0101','yyyymmdd') +
                  7*(to_number(substr(dt_ywd,5,2))-1) -
                  1,
                decode(substr(dt_ywd,7,1),'1','SUN',
                                          '2','MON',
                                          '3','TUE',
                                          '4','WED',
                                          '5','THU',
                                          '6','FRI',
                                          '7','SAT')) tst_revert
  from(select dt, 
              to_char(dt,'yyyywwd') dt_ywd
         from (select to_date('01/01/2015','dd/mm/yyyy')+level-1 dt
                 from dual
              connect by level < 500))

This gives me the following output: 这给了我以下输出:

DT          DT_YWD  TST_REVERT
----------- ------- -----------
01/01/2015  2015015 01/01/2015
02/01/2015  2015016 02/01/2015
03/01/2015  2015017 03/01/2015
04/01/2015  2015011 04/01/2015
05/01/2015  2015012 05/01/2015
06/01/2015  2015013 06/01/2015
07/01/2015  2015014 07/01/2015
08/01/2015  2015025 08/01/2015
09/01/2015  2015026 09/01/2015
10/01/2015  2015027 10/01/2015

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM