|
| Hjælp til en CASE ORDER BY funktion i en S~ Fra : OZ |
Dato : 26-04-02 14:52 |
|
Hej NG
Jeg sidder og arbejder med en SP hvor jeg giver brugeren mulighed for at
sortere et resultat vha en parameter sendt til en SP.
Problemet er at hvis jeg sender 3, 5, 7, 9, 11 afsted til min SP, så skriver
den:
"The conversion of a char data type to a datetime data type resulted in an
out-of-range datetime value."
Men det er jo ikke det jeg beder den om i min case eller er det? For mig ser
ud som om den chekker 1 selvom jeg beder om et andet tal.
ORDER BY
CASE
WHEN @_orderByClause = '1' THEN CONVERT(datetime(8),MyDate)
WHEN @_orderByClause = '3' THEN CONVERT(varchar(50),BirthDate)
WHEN @_orderByClause = '5' THEN CONVERT(varchar(50),Sex)
WHEN @_orderByClause = '7' THEN CONVERT(varchar(50),Height)
WHEN @_orderByClause = '9' THEN CONVERT(varchar(50),Father)
WHEN @_orderByClause = '11' THEN CONVERT(varchar(50),CustomerName)
END DESC
Jeg har så forsøgt at converte Mydate til VarChar men så sorterer den jo
ikke på dato format men efter tallene og det er jo heller ikke meningen. Men
så virker 3, 5, 7, 9 og 11 hmmm....
Hvad gør jeg forkert???
Håber at der er nogen der kan hjælpe mig med at gennemskue det her.
På forhånd tak
Oz
| |
Sune Hansen (26-04-2002)
| Kommentar Fra : Sune Hansen |
Dato : 26-04-02 18:18 |
|
Hejsa,
Når man anvender en CASE i en ORDER BY skal alle udfald være at samme
datatype. Linien:
WHEN @_orderByClause = '1' THEN CONVERT(datetime(8),MyDate)
skal derfor rettes til:
WHEN @_orderByClause = '1' THEN CONVERT(VARCHAR(50),MyDate).
Det skulle løse problemet
- Sune
http://www.sqljoint.com - artikler og tips om SQL Server på dansk.
"OZ" <no_spam_gonzo@strike-team.com> wrote in message
news:aablqt$pb$1@sunsite.dk...
> Hej NG
>
> Jeg sidder og arbejder med en SP hvor jeg giver brugeren mulighed for at
> sortere et resultat vha en parameter sendt til en SP.
>
> Problemet er at hvis jeg sender 3, 5, 7, 9, 11 afsted til min SP, så
skriver
> den:
> "The conversion of a char data type to a datetime data type resulted in an
> out-of-range datetime value."
>
> Men det er jo ikke det jeg beder den om i min case eller er det? For mig
ser
> ud som om den chekker 1 selvom jeg beder om et andet tal.
>
> ORDER BY
> CASE
> WHEN @_orderByClause = '1' THEN CONVERT(datetime(8),MyDate)
> WHEN @_orderByClause = '3' THEN CONVERT(varchar(50),BirthDate)
> WHEN @_orderByClause = '5' THEN CONVERT(varchar(50),Sex)
> WHEN @_orderByClause = '7' THEN CONVERT(varchar(50),Height)
> WHEN @_orderByClause = '9' THEN CONVERT(varchar(50),Father)
> WHEN @_orderByClause = '11' THEN CONVERT(varchar(50),CustomerName)
> END DESC
>
> Jeg har så forsøgt at converte Mydate til VarChar men så sorterer den jo
> ikke på dato format men efter tallene og det er jo heller ikke meningen.
Men
> så virker 3, 5, 7, 9 og 11 hmmm....
>
> Hvad gør jeg forkert???
>
> Håber at der er nogen der kan hjælpe mig med at gennemskue det her.
>
> På forhånd tak
>
> Oz
>
>
>
>
>
>
| |
OZ (26-04-2002)
| Kommentar Fra : OZ |
Dato : 26-04-02 18:35 |
|
"Sune Hansen" <sunedh@hotmail.com> skrev i en meddelelse
news:3cc98bd2$0$11911$edfadb0f@dspool01.news.tele.dk...
> Hejsa,
>
> Når man anvender en CASE i en ORDER BY skal alle udfald være at samme
> datatype. Linien:
>
> WHEN @_orderByClause = '1' THEN CONVERT(datetime(8),MyDate)
>
> skal derfor rettes til:
>
> WHEN @_orderByClause = '1' THEN CONVERT(VARCHAR(50),MyDate).
>
> Det skulle løse problemet
Hej Sune
Nej ikke rigtigt, fordi den så ikke sorterer korrekt på dato, den vil her
tage og sortere det som en streng hvilket ikke er meningen, den skulle jo
netop sortere det som en dato.....
Kan man på en eller anden smart måde gøre det om?
Man kunne jo selvfølgelig lave en case til DateTime og en til VarChar, men
er det ikke også lidt meget og gøre ud af det???
Oz
| |
Sune Hansen (26-04-2002)
| Kommentar Fra : Sune Hansen |
Dato : 26-04-02 19:21 |
|
Hejsa,
Hovsa, det har du ret i, fejlen forsvinder, men resultatet er ikke rigtigt.
Du er selv lidt inde på det, og jeg må tilstå at jeg ikke har testet det
100%, men skulle følgende ikke kunne gøre det:
ORDER BY
CASE
WHEN @_orderByClause = '1' THEN ''
WHEN @_orderByClause = '3' THEN CONVERT(varchar(50),BirthDate)
WHEN @_orderByClause = '5' THEN CONVERT(varchar(50),Sex)
WHEN @_orderByClause = '7' THEN CONVERT(varchar(50),Height)
WHEN @_orderByClause = '9' THEN CONVERT(varchar(50),Father)
WHEN @_orderByClause = '11' THEN CONVERT(varchar(50),CustomerName)
END,
CASE WHEN @_orderByClause = '1' THEN Mydate
ELSE CONVERT(DATETIME, '1.1.2000')
END
Nu sorteres der i virkeligheden på to kolonner i stedet for en. Afhængigt af
@_orderByClause er den ene kolonne dog altid en konstant.
- Sune
"OZ" <no_spam_gonzo@strike-team.com> wrote in message
news:aac2tj$g4o$1@sunsite.dk...
>
> "Sune Hansen" <sunedh@hotmail.com> skrev i en meddelelse
> news:3cc98bd2$0$11911$edfadb0f@dspool01.news.tele.dk...
> > Hejsa,
> >
> > Når man anvender en CASE i en ORDER BY skal alle udfald være at samme
> > datatype. Linien:
> >
> > WHEN @_orderByClause = '1' THEN CONVERT(datetime(8),MyDate)
> >
> > skal derfor rettes til:
> >
> > WHEN @_orderByClause = '1' THEN CONVERT(VARCHAR(50),MyDate).
> >
> > Det skulle løse problemet
>
>
> Hej Sune
>
> Nej ikke rigtigt, fordi den så ikke sorterer korrekt på dato, den vil her
> tage og sortere det som en streng hvilket ikke er meningen, den skulle jo
> netop sortere det som en dato.....
>
> Kan man på en eller anden smart måde gøre det om?
>
> Man kunne jo selvfølgelig lave en case til DateTime og en til VarChar, men
> er det ikke også lidt meget og gøre ud af det???
>
> Oz
>
>
| |
OZ (26-04-2002)
| Kommentar Fra : OZ |
Dato : 26-04-02 19:31 |
|
"Sune Hansen" <sunedh@hotmail.com> skrev:
> Hovsa, det har du ret i, fejlen forsvinder, men resultatet er ikke
rigtigt.
> Du er selv lidt inde på det, og jeg må tilstå at jeg ikke har testet det
> 100%, men skulle følgende ikke kunne gøre det:
>
> ORDER BY
> CASE
> WHEN @_orderByClause = '1' THEN ''
> WHEN @_orderByClause = '3' THEN CONVERT(varchar(50),BirthDate)
> WHEN @_orderByClause = '5' THEN CONVERT(varchar(50),Sex)
> WHEN @_orderByClause = '7' THEN CONVERT(varchar(50),Height)
> WHEN @_orderByClause = '9' THEN CONVERT(varchar(50),Father)
> WHEN @_orderByClause = '11' THEN CONVERT(varchar(50),CustomerName)
> END,
> CASE WHEN @_orderByClause = '1' THEN Mydate
> ELSE CONVERT(DATETIME, '1.1.2000')
> END
>
> Nu sorteres der i virkeligheden på to kolonner i stedet for en. Afhængigt
af
> @_orderByClause er den ene kolonne dog altid en konstant.
Hej Sune
Det ser spændende ud =) Jeg vil prøve og se om det virker efter hensigten.
Tak
Hilsen Oz
| |
OZ (26-04-2002)
| Kommentar Fra : OZ |
Dato : 26-04-02 21:05 |
|
"Sune Hansen" <sunedh@hotmail.com> skrev:
> Hovsa, det har du ret i, fejlen forsvinder, men resultatet er ikke
rigtigt.
> Du er selv lidt inde på det, og jeg må tilstå at jeg ikke har testet det
> 100%, men skulle følgende ikke kunne gøre det:
>
> ORDER BY
> CASE
> WHEN @_orderByClause = '1' THEN ''
> WHEN @_orderByClause = '3' THEN CONVERT(varchar(50),BirthDate)
> WHEN @_orderByClause = '5' THEN CONVERT(varchar(50),Sex)
> WHEN @_orderByClause = '7' THEN CONVERT(varchar(50),Height)
> WHEN @_orderByClause = '9' THEN CONVERT(varchar(50),Father)
> WHEN @_orderByClause = '11' THEN CONVERT(varchar(50),CustomerName)
> END,
> CASE WHEN @_orderByClause = '1' THEN Mydate
> ELSE CONVERT(DATETIME, '1.1.2000')
> END
>
> Nu sorteres der i virkeligheden på to kolonner i stedet for en. Afhængigt
af
> @_orderByClause er den ene kolonne dog altid en konstant.
En anden måske nemmere løsning kunne vel egentlig også være at omskrive
MyDate til yyyy-mm-dd med denne sætning CONVERT(varchar(50),MyDate,121), så
behøver jeg jo ikke at lave flere cases.
Oz
| |
Sune Hansen (27-04-2002)
| Kommentar Fra : Sune Hansen |
Dato : 27-04-02 15:42 |
|
Det lyder da i virkeligheden som den bedst løsning
- Sune
>
> En anden måske nemmere løsning kunne vel egentlig også være at omskrive
> MyDate til yyyy-mm-dd med denne sætning CONVERT(varchar(50),MyDate,121),
så
> behøver jeg jo ikke at lave flere cases.
>
> Oz
>
>
>
| |
|
|