Avatar billede neoman Novice
15. maj 2007 - 20:05 Der er 4 kommentarer og
1 løsning

MS SQL og datoer - hjælp til select

Jeg har følgende tabel :
Tasks
TaskID - integer
ActivityID - integer
TaskStart - datetime, med data i både dato- og tids-delen.
TaskEnd - som TaskEnd
AllDay - bool
Comment - string

og for en given aktivitet, kan der kun være een opgave (task) per dag, og kan forekomme på samme eller forskellige tider på dagen. tidspunkter

Nu ønsker jeg at finde de første X datoer fra et givet starttidspunkt på hvilke en given aktivitet forekommer. Det går skam fint nok med :

SELECT TOP (@NumberOfTaskDays) TaskStart
FROM          Tasks AS Tasks
WHERE      (ActivityID = @ActivityID) AND (TaskStart >=@StartDate)
ORDER BY TaskStart

Så har jeg en liste af tidspunkter ,men ej datoer.

Nu er mit ønske, at finde alle de opgaver (tasks) som tilhører alle aktiviteterne og som forekommer på de samme datoer (ej tidspunkter, men datoer), som for opgaverne fra den ovenstående select.

Noget i stil med nedenstående (som ville virke hvis TaskStart/TaskEnd var datoer):


SELECT  TaskID, ActivityID, TaskStart, TaskEnd, AllDay, Comment
FROM    Tasks
WHERE  (TaskStart IN
        (SELECT TOP (@NumberOfTaskDays) TaskStart
            FROM  Tasks AS Tasks_1
            WHERE  (ActivityID = @ActivityID) AND (TaskStart >= @StartDate)
            ORDER BY TaskStart))

Nu er problemet at TaskStart/TaskEnd er DateTime - så medmindre alle opgaver starter på både samme dato og tid som min liste i IN, så vil den SELECT jo fejle.

Jeg har ikke kunnet finde nogen funktion som trækker Dato-delen ud af en datetime, men kun de separate Day, Month, Year - og så ved jeg ikke hvordan jeg gifter mine to selects.

Måske er der en anden måde at gøre det på - alle forslag modtages :-)
Avatar billede ramad Praktikant
15. maj 2007 - 20:12 #1
Avatar billede neoman Novice
15. maj 2007 - 20:34 #2
Den lyder fornuftigt - og så arbejder man med den interne repræsentation fremfor string conversions, og det er fint. Nu er jeg ikke vildt erfaren ud i SQL - hvordan h... får jeg squishet
    * CAST(
    * FLOOR( CAST( GETDATE() AS FLOAT ) )
    * AS DATETIME
    * )
ind i min select - bare ud i en køre ?? og artiklen omtaler date/time stamps - gælder proceduren også for almindelige datetime ? (nu er mine datetime's faktisk SmallDateTime)

Så hvis jeg har forstået det rigtig skal jeg skrive, i min sub-query :



  (SELECT TOP (@NumberOfTaskDays) CAST(FLOOR( CAST( TaskStart AS FLOAT ) ) AS SMALLDATETIME)
            FROM  Tasks AS Tasks_1
            WHERE  (ActivityID = @ActivityID) AND (TaskStart >= @StartDate)
            ORDER BY TaskStart))

er det rigtigt ?
Avatar billede neoman Novice
15. maj 2007 - 20:55 #3
AAAArgh - sikke noget nomenklatur-rod i artiklen. En getdate får fat i en datetime og ikke en datetimestamp (som åbenbart er noget helt andet end noget emd dato/tid) - folk har bare ikke magten over ordene :)

Nu har jeg klasket det ind i min select og den eksekverer (men har iendnu ingen data at finde)
Er der nogen som kan overskue om dét at jeg bruger smalldatetime, fremfor datetime , har nogen konsekvenser for proceduren ?
Avatar billede neoman Novice
15. maj 2007 - 23:12 #4
tak ramad - det virker faaaaaame ! :) læg et svar
Avatar billede neoman Novice
11. juni 2007 - 15:12 #5
Hmm intet svar- jeg siger tak for hjælpen så og lukker.
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