Avatar billede dennisbjorn Juniormester
12. januar 2010 - 11:13 Der er 12 kommentarer og
1 løsning

Dato formateret til uge driller

Hej,

Fra en MS-SQL db henter jeg et dato felt ("yyyymmdd" varchar) ud på en asp-side, hvor dato formateres til uge (yyyy-dd) således:


SELECT CAST(DATEPART(yyyy, Dato) as varchar(4)) + '-' + RIGHT('00' + CAST(DATEPART(ww, Dato) as varchar(2)),2) AS Uge

Datoer fra 2009 formateres til korrekt uge, med i 2010 vises uge 1 som uge 2, uge 2 vises som uge 3….?

Håber på hjælp!
Avatar billede michael_stim Ekspert
12. januar 2010 - 11:24 #1
Ved ikke hvordan man løser det (foruden at minusse uge med 1, hvilket ikke er optimalt), men tror du ikke det har at gøre med at der var 53 uger i 2009. Prøv at google det.
Avatar billede terry Ekspert
12. januar 2010 - 11:28 #3
http://doc.ddart.net/mssql/sql70/da-db_8.htm

(SET DATEFIRST, which sets the first day of the week.)
Avatar billede terry Ekspert
12. januar 2010 - 11:32 #4
In VB the datepart function has parameters to set th efirst day of the week and also which week is the first in the year. Silly its not the same in MSSQL
Avatar billede nop Nybegynder
12. januar 2010 - 13:13 #5
ISO8601 er det vi bruger i Danmark. MSSQL bruger et eller andet amerikansk ;o)
Her er et workaround:

declare @dt datetime

set @dt = '2011-1-1'

select floor((((floor(((cast(@dt as int) + 692501) % 146097) / 7) * 28 + 4383) % 146096) % 1461) / 28 + 1)

Dette giver som er korrekt 53.
Avatar billede dennisbjorn Juniormester
12. januar 2010 - 14:06 #6
Har desværre ikke fundet en løsning..

Jeg er ikke "haj" - så det kan godt være at jeg spørger dumt nop, men din løsning med at declare formatet, skal det laves på SQL serverens applikation?

Vil helst hvis det kan laves i SELECT sætningen på asp-siden?
Avatar billede nop Nybegynder
12. januar 2010 - 14:21 #7
Dette SQL statement skulle virke:

SELECT CAST(DATEPART(yyyy, Dato) as varchar(4)) + '-' + RIGHT('00' + CAST(floor((((floor(((cast(Dato as int) + 692501) % 146097) / 7) * 28 + 4383) % 146096) % 1461) / 28 + 1) as varchar(2)),2) AS Uge

--nop
Avatar billede dennisbjorn Juniormester
12. januar 2010 - 15:05 #8
Giver desværre forkert visning af ugerne.

eks.

uge 1 vises som 12
uge 2 vises som 13
Avatar billede nop Nybegynder
12. januar 2010 - 15:24 #9
Testede lidt, og der er faktisk en fejl som giver 2 dage forkert, men ikke 10 dage. Jeg ved ikke hvad det er, men her er noget du kan teste lidt med i en Query-analyser:

<copy start>>>>>>
declare @dt datetime

set @dt = '2010-4-1'

select floor((((floor(((cast(@dt as int)+2 + 692501) % 146097) / 7) * 28 + 4383) % 146096) % 1461) / 28 + 1)

SELECT CAST(DATEPART(yyyy, @dt) as varchar(4)) + '-' + RIGHT('00' + CAST(floor((((floor(((cast(@dt as int) + 2 + 692501) % 146097) / 7) * 28 + 4383) % 146096) % 1461) / 28 + 1) as varchar(2)),2) AS Uge
<<<<<<<copy slut>

Hvis man paster og kører ovenstående så fåes to resultater:
1: 1
2: 2010-01

Prøv det selv.
--nop
Avatar billede dennisbjorn Juniormester
12. januar 2010 - 19:46 #10
ok - jeg prøver
Avatar billede wagner Nybegynder
12. januar 2010 - 19:49 #11
Denne artikel viser en måde at klare problemstillingen på:
http://www.sqlservercentral.com/articles/Advanced+Querying/onthetrailoftheisoweek/1675/
Avatar billede dennisbjorn Juniormester
13. januar 2010 - 09:12 #12
Tak Wagner - det ser ud til at virke.

Men jeg få kun returneret uge nummeret, skal også have årstallet med.

Nogle idéer?
Avatar billede nop Nybegynder
13. januar 2010 - 11:12 #13
Hvorfor fik jeg egentlig points?

Svar til det sidste spørgsmål: så må du sætte året foran.
CAST(DATEPART(yyyy, Dato) as varchar(4)) + '-' + <uge_udregning>

--nop
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