Avatar billede sbm Nybegynder
22. oktober 2002 - 12:40 Der er 11 kommentarer og
2 løsninger

Config af dato

Jeg har et datofelt i en tabel, og laver eksempelvis følgende SQL opslag:

select dato from nyheder where to_char(dato,'ww') = 42

Uge 42 i indeværende år, burde i min kalender gå fra d. 14. til d. 20. oktober, men af en eller anden grund bliver rækker med datoen 21. oktober vist under uge 42, og rækker med datoen 14. oktober bliver vist under uge 41. Altså har jeg mandagene til at ligge i den forkerte uge...?

Hvad skal jeg konfigurere for at få databasen til at opføre sig normalt?
Avatar billede teepee Nybegynder
22. oktober 2002 - 12:49 #1
I usa er søndag den 1. dag i ugen. Prøv med IW som er international week. Hvis det ikke virker skal du prøv noget andet. Jeg leder lige i gamle procedurer.
Avatar billede pgroen Nybegynder
22. oktober 2002 - 12:50 #2
Det KAN være noget med din NLS-opsætning - prøv med

select dato from nyheder where to_char(dato,'ww','NLS_DATE_LANGUAGE=Danish') = 42;
Avatar billede teepee Nybegynder
22. oktober 2002 - 12:51 #3
I procedurer kan du bruge
        dbms_session.set_nls('nls_language', '''DANISH''');
        dbms_session.set_nls('nls_territory', '''DENMARK''');
for at sørge for at "regne" på dansk.
Avatar billede sbm Nybegynder
22. oktober 2002 - 12:55 #4
pgroen >> Jeg har lige fyret din foreslåede SQL sætning af, men det giver det samme resultat...

teepee >> Det prøver jeg lige af. Jeg vender retur.
Avatar billede pgroen Nybegynder
22. oktober 2002 - 12:57 #5
teepee har ret:


select to_char(to_date('21102002','DDMMYYYY'),'ww','NLS_DATE_LANGUAGE=American'),
        to_char(to_date('21102002','DDMMYYYY'),'ww','NLS_DATE_LANGUAGE=Danish'),
        to_char(to_date('21102002','DDMMYYYY'),'iw')
from dual
Avatar billede sbm Nybegynder
22. oktober 2002 - 12:57 #6
Hmmm. Jeg sidder og retter i et Perl script, der arbejder op mod en oracle db, og jeg sætter i forvejen de nævnte variable:

        $ENV{'LANG'} = 'da_DK.ISO8859-1';
        $ENV{'NLS_LANG'}='american_america.we8iso8859p1';
Avatar billede sbm Nybegynder
22. oktober 2002 - 13:06 #7
DOH DOH DOH DOH DOOOOOOHHHHH!!!!

Jeg sidder lige her og skriver hvad jeg selv har gjort galt. Jeg mener bestemt jeg på et tidspunkt rettede NLS_LANG, men min copy/paste viser med al tydelighed at jeg må have gjort noget galt, for der står stadig american....
Avatar billede sbm Nybegynder
22. oktober 2002 - 13:15 #8
Hmmm.

$ENV{'NLS_LANG'}='DANISH_DENMARK.WE8ISO8859P1';

No difference. :-/
Avatar billede sbm Nybegynder
22. oktober 2002 - 13:31 #9
...og NLS_DATE_LANGUAGE=Danish virker heller ikke. Uanset om jeg bruger den på to_char eller to_date
Avatar billede pgroen Nybegynder
22. oktober 2002 - 13:36 #10
OK, men virker teepee's 'IW' format i det mindste ?
Avatar billede sbm Nybegynder
22. oktober 2002 - 13:37 #11
Ahhh.... Ved nærmere eftersyn fik jeg 'iw' til at virke... Jeg smider lidt af pointene af til teepee for arbejdet...
Avatar billede sbm Nybegynder
22. oktober 2002 - 13:37 #12
Iiiih. Jeg vrøvler... Det var pgroen der skulle have lidt for arbejdet... :-)
Avatar billede i3448 Nybegynder
23. oktober 2002 - 14:17 #13
Hej
Der er problemer med at få IW og WW til at virke korrekt i alle situationer, punkt 2 herunder skulle give det rigtige resultat:

Oracle Metalink Note:121905.1 
How to Find the Actual Week Number for a Particular Date

Purpose:
========
The purpose of this article is to explain how to find the actual week 
number for a particular date.  There are some countries where format masks such as 'WW' or 'IW' do not return the week number according to practices
used in those countries.

Scope & Application:
====================
This article is intended for anyone who needs to obtain a week number for 
a particular date, and if their rules for counting week numbers conform 
to the following criteria: 

  o The week starts on Monday.

  o There is a week at the end of the calendar year which has two different numbers: 

    a) 53 or 54 - for dates from the current year
    b) 1 for dates from the next year

The second condition breaks the ISO rule so it is not possible to use the
'IW' mask.  And, the 'WW' mask gives the correct week number only in years
when the first week of the year starts on Monday.

How to Find the Actual Week Number for a Particular Date:
=========================================================
If the rule for counting week numbers conforms to the above-mentioned 
criteria, which is the case in countries like the Czech Republic and Slovakia, use the following code to obtain the correct week number for a particular date:

  1. Ensure that your session has set the correct NLS_TERRITORY:

    ALTER SESSION SET nls_territory='slovakia'; 

  2. Use the following SELECT statement:

    SELECT
      TRUNC(( TO_NUMBER(TO_CHAR(sysdate,'ddd'))- 
            (7-TO_NUMBER(TO_CHAR(TRUNC(sysdate,'yyyy'),'d'))+1)-1)/7+2) SK_WEEK 
    FROM dual;

  3. Compare the results for various dates:

    A) 1.1.2000 - should be in week 1

    SQL> col week for a10
    SQL> select to_char(to_date('1.1.2000','dd.mm.yyyy'),'IW') week from dual;

    WEEK
    ----------
    52

    SQL> select to_char(to_date('1.1.2000','dd.mm.yyyy'),'WW') week from dual;

    WEEK
    ----------
    01

    SQL>  select
      2  trunc(( to_number(to_char(to_date('&date','DD.MM.YYYY'),'ddd'))-
      3  (7-to_number(to_char(trunc(to_date('&date','DD.MM.YYYY'),'yyyy'),'d'))+1)-1)/7+2) sk_week
      4  from dual;
    Enter value for date: 1.1.2000
    old  2:  trunc(( to_number(to_char(to_date('&date','DD.MM.YYYY'),'ddd'))-
    new  2:  trunc(( to_number(to_char(to_date('1.1.2000','DD.MM.YYYY'),'ddd'))-
    Enter value for date: 1.1.2000
    old  3:  (7-to_number(to_char(trunc(to_date('&date','DD.MM.YYYY'),'yyyy'),'d'))+1)-1)/7+2) sk_week
    new  3:  (7-to_number(to_char(trunc(to_date('1.1.2000','DD.MM.YYYY'),'yyyy'),'d'))+1)-1)/7+2) sk_we

      SK_WEEK
    ---------
            1


    B) 3.1.2000 - should be in week 2

    SQL> select to_char(to_date('3.1.2000','dd.mm.yyyy'),'IW') week from dual;

    WEEK
    ----------
    01

    SQL> select to_char(to_date('3.1.2000','dd.mm.yyyy'),'WW') week from dual;

    WEEK
    ----------
    01

    SQL>  select
      2  trunc(( to_number(to_char(to_date('&date','DD.MM.YYYY'),'ddd'))-
      3  (7-to_number(to_char(trunc(to_date('&date','DD.MM.YYYY'),'yyyy'),'d'))+1)-1)/7+2) sk_week
      4  from dual;
    Enter value for date: 3.1.2000
    old  2:  trunc(( to_number(to_char(to_date('&date','DD.MM.YYYY'),'ddd'))-
    new  2:  trunc(( to_number(to_char(to_date('3.1.2000','DD.MM.YYYY'),'ddd'))-
    Enter value for date: 3.1.2000
    old  3:  (7-to_number(to_char(trunc(to_date('&date','DD.MM.YYYY'),'yyyy'),'d'))+1)-1)/7+2) sk_week
    new  3:  (7-to_number(to_char(trunc(to_date('3.1.2000','DD.MM.YYYY'),'yyyy'),'d'))+1)-1)/7+2) sk_we

      SK_WEEK
    ---------
            2


    C) 31.12.2012 - should be in week 54

    SQL> select to_char(to_date('31.12.2012','dd.mm.yyyy'),'IW') week from dual;

    WEEK
    ----------
    01

    SQL> select to_char(to_date('31.12.2012','dd.mm.yyyy'),'WW') week from dual;

    WEEK
    ----------
    53

    SQL>  select
      2  trunc(( to_number(to_char(to_date('&date','DD.MM.YYYY'),'ddd'))-
      3  (7-to_number(to_char(trunc(to_date('&date','DD.MM.YYYY'),'yyyy'),'d'))+1)-1)/7+2) sk_week
      4  from dual;
    Enter value for date: 31.12.2012
    old  2:      trunc(( to_number(to_char(to_date('&date','DD.MM.YYYY'),'ddd'))-
    new  2:      trunc(( to_number(to_char(to_date('31.12.2012','DD.MM.YYYY'),'ddd'))-
    Enter value for date: 31.12.2012
    old  3:      (7-to_number(to_char(trunc(to_date('&date','DD.MM.YYYY'),'yyyy'),'d'))+1)-1)/7+2) sk_w
    new  3:      (7-to_number(to_char(trunc(to_date('31.12.2012','DD.MM.YYYY'),'yyyy'),'d'))+1)-1)/7+2)

      SK_WEEK
    ---------
            54

References:
===========

Oracle8i SQL Reference Guide.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester