22. oktober 2002 - 12:40Der 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?
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.
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.
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....
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.
Synes godt om
Ny brugerNybegynder
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.