Avatar billede noodrem Nybegynder
18. juni 2009 - 19:31 Der er 7 kommentarer og
1 løsning

Getdate

Hej

Jeg vil lave en opdeling, hvor alt hvor købsdatoen i min database (dateduekey) er større end 30 date fra dags dato.

Til dette har jeg forsøgt mig med

SELECT dateduekey, CASE WHEN ( dateduekey > (GetDate()-30) ) THEN '30+' ELSE '30-' END AS 'Sorting'
FROM dbo.FactSales

Men her melder serveren om følgende fejl:
Arithmetic overflow error converting expression to data type datetime

Hvad gør jeg forkert?
Avatar billede showsource Seniormester
18. juni 2009 - 20:31 #1
Kender ikke sql server syntaks, men er det ikke blot

SELECT dateduekey WHERE dateduekey > (GetDate()-30) as 'sortering'



I mysql ville det være
SELECT dateduekey WHERE dateduekey > DATE_SUB(NOW(), INTERVAL 30 DAY);
Avatar billede noodrem Nybegynder
18. juni 2009 - 20:38 #2
Jeg skal bruge det i en kube (analysis services), og skal derfor have en opdeling der viser hvilke kunder der ikke har booket inden for de seneste 30 dage.
Avatar billede aaberg Nybegynder
18. juni 2009 - 20:41 #3
Jeg forstår ikke helt dit spørgsmål! Ønsker du at søge efter alle dateduedate som er inden for de sidste 30 dage? Eller misforstår jeg?

Denne query henter alle dateduekey som er inden for de sidste 30 dage eller nyere (Jeg går ud fra at dateduekey er af datatypen datetime)

SELECT dateduekey
FROM dbo.FactSales
WHERE dateduekey > DATEADD(DAY, -30, GETDATE())

Her er dokumentationen for DATEADD funktionen:
http://msdn.microsoft.com/en-us/library/ms186819.aspx

Man kan ikke bare skrive getdate()-30 som du prøver på, da SQL Serveren ikke kan gætte om det er sekunder, minutter, timer, dage eller måneder du ønsker at trække fra.
Avatar billede aaberg Nybegynder
18. juni 2009 - 20:45 #4
Er det du ønsker, at sætte et flag ved alle dateduekey som ikke er inden for de sidste 30 dage?

Jeg har modificeret din originale query lidt:

SELECT dateduekey, CASE WHEN ( dateduekey > DATEADD(DAY, -30, GETDATE() ) THEN '30+' ELSE '30-' END AS 'Sorting'
FROM dbo.FactSales
Avatar billede showsource Seniormester
18. juni 2009 - 20:46 #5
Ja, jeg glemte selvf. en FROM :O)
Og må vist hellere få installeret den SQL Express til at teste på !
Avatar billede noodrem Nybegynder
18. juni 2009 - 20:52 #6
Beklager den dårlige formulering. Jeg ønsker at lave en ekstra dimension til min fact tabel, således at jeg kan opdele på kunder, og se hvilke der ikke har lavet nogle handler inden for de seneste 30 dage.

Dette forsøgte jeg ved at lave ovenstående som en ny tabel i Data source view.

Dateduekey ligger i mit eksempel som en int (eks 20010320 for 20 marks 2001)
Avatar billede noodrem Nybegynder
18. juni 2009 - 22:07 #7
Med en lille modificering af din kode aaberg, fik jeg det til at virke:

SELECT    Dateduekey, CASE WHEN CAST(CAST(dateduekey AS VARCHAR) AS DATETIME) > DATEADD(DAY, - 1825, GETDATE())
                      THEN '-30' ELSE '+30' END AS 'Sorting'
FROM        dbo.FactSales

Tak for hjælpen begge to.
Du smider bare et svar aaberg.
Avatar billede aaberg Nybegynder
19. juni 2009 - 08:31 #8
Godt du fik det til at virke :-)
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