Jeg har nu brug for at kunne trække alle de rækker ud, hvor startDates tid er større end startHours + startMinutes (som er tid delt op i to felter)....
Det jeg har indtil nu er:
SELECT dbo.Employees.employeeId, dbo.Employees.employeeName, dbo.Employees.employeeGroupId, dbo.Employees.isActive, dbo.WorkingHours.startHours, dbo.WorkingHours.startMinutes, dbo.TimeStamps.startDate, dbo.TimeStamps.regStartDate FROM dbo.Employees LEFT OUTER JOIN dbo.TimeStamps ON dbo.Employees.employeeId = dbo.TimeStamps.employeeId LEFT OUTER JOIN dbo.WorkingHours ON dbo.Employees.employeeId = dbo.WorkingHours.employeeId WHERE (dbo.Employees.isActive = 1) AND (CONVERT(VARCHAR(10), dbo.TimeStamps.startDate, 120) >= '2011-11-22') AND (CONVERT(VARCHAR(10), dbo.TimeStamps.startDate, 120) <= '2011-12-08')
Her får jeg korrekt 2 rækker ud. Nu er det så jeg også vil spørge i min where clause på om startDate's tid er større end startHours + startMinutes (sat sammen som tid).
De to rækker jeg får ud nu (har filtreret det urelevante fra): Navn startHours startMinutes startDate Hans Hansen 8 0 22-11-2011 08:00:00 Hans Hansen 8 0 08-12-2011 12:27:31
Det vil sige efter næste filtrering (som er den jeg skal have hjælp til) skal der kun være en....nemlig Hans Hansen 8 0 08-12-2011 12:27:31 Da 12:27 er større en 08:00
Jeg har en datetime = startDate Jeg har så to int felter = startHours og startMinutes
nu vil jeg så (jeg er fuldstændig ligeglad med selve datoen) - have at den går alle rækker igennem hvor startDate er og så se på selve tiden for startDate er den større end startHours + startMinutes (startHours og startMinutes skal jo så på en eller anden måde lægges sammen som en time/minutfelt)....
Det jeg ville gøre i c# var at hente datoen (og kun datoen - ikke tiden) ud fra startDate - for hver enkelt række - smide den i en streng - tilføje startHours og startMinutes - og så convertere den til en dato og så lave en timespan på startDate og den konverterede dato - og altså gøre dette for hver række - hvis startDate så var større smide dem i en ny tabel og så bruge den nye tabel.....
Men aner så ikke hvordan man gør i SQL :-)
Og forklaring: Det drejer sig om at en medarbejder får angivet hvornår møde tidspunkt er - her i to int felter startHours (= 08) og startMinutes (=30).... Nu skal han så hver dag "stemple" ind - det gør han med en startDate (dato og klokkeslet)...Nu er det så en slemmer slemmer chef - han vil kontrollere om medarbejderen også møder som han skal - gør han ikke vil han have en liste med de medarbejdere, der ikke gør.... Og dertil skal jeg jo så gemmemgå samtlige rækker for indstemplingen og tjekke op med mødetidspunktet. Håber det giver lidt mere mening - ellers sig til :-)
Men ... jeg ville nok gemme lidt mere information om hver row, så har du har alt det du skal bruge for at lave din SELECT's, da dette kan blive meget langsom i fremtiden.
Hvis det er et eksisterende system, ja, så er der ikke så meget at gøre.
Den converet du har lavet er jo statisk for hver row. Men det at lave convert er langsom for SQL og kan ikke indexeres. De data kunne ligeså godt have været i en column for sig selv.
Ok - og din besked fik mig til at tænke.......nu havde jeg i forvejen lavet nogle tempTables (da jeg ikke kunne lave en where på en "beregning" jeg lavede i selecten) så jeg har tilføjet endnu en tempTable....Så den laver beregningen på antal rækker der bliver hentet ud i første hug, hvor den sorterer alle inaktive væk og ikke mindst kun giver rækker udfra en bestemt dato interval....
Normalt vil det sige, at den henter i første hug alle aktive medarbejdere udfra dags dato (sjældent de vil være interesseret i at hente ud for eks. for en måned). Og nu kunderne jeg laver det her til, vil altså ikke have SÅ mange medarbejdere...
Nu laver jeg så min "beregning" udfra den mindre antal rækker og smider over i en ny tempTable (da jeg ikke kan lave where *suk*)...
SET @employeeId = '' SET @employeeGroupId = '' Set @lateMoreThanMinutes = 5 Set @fromDate = '2011-11-22 20:20:20' Set @toDate = '2011-12-08 20:20:20'
DROP TABLE #tempTable
SELECT dbo.Employees.employeeId, dbo.Employees.employeeName, dbo.Employees.employeeGroupId, dbo.Employees.isActive, dbo.WorkingHours.startHours, dbo.WorkingHours.startMinutes, dbo.TimeStamps.startDate, dbo.TimeStamps.regStartDate, dbo.TimeStamps.timeStampId, dbo.EmployeeGroups.employeeGroupName INTO #tempTable FROM dbo.Employees LEFT OUTER JOIN dbo.EmployeeGroups ON dbo.Employees.employeeGroupId = dbo.EmployeeGroups.employeeGroupId LEFT OUTER JOIN dbo.TimeStamps ON dbo.Employees.employeeId = dbo.TimeStamps.employeeId LEFT OUTER JOIN dbo.WorkingHours ON dbo.Employees.employeeId = dbo.WorkingHours.employeeId WHERE (dbo.Employees.isActive = 1) AND (CONVERT(VARCHAR(10), dbo.TimeStamps.startDate, 120) >= @fromDate) AND (CONVERT(VARCHAR(10), dbo.TimeStamps.startDate, 120) <= @toDate)
SELECT employeeId,employeeName,employeeGroupId, isActive, startHours, startMinutes, startDate,regStartDate, timeStampId, newDate, employeeGroupName, DATEDIFF(Minute, newDate, startDate) AS diffDateMinutes INTO #tempTable3 FROM #tempTable2 WHERE (startDate > newDate)
DROP TABLE #tempTable2
IF @employeeId <> '' BEGIN SELECT * FROM #TempTable3 WHERE diffDateMinutes > @lateMoreThanMinutes AND employeeId = @employeeId ORDER BY startDate DESC END ELSE IF @employeeGroupId <> '' BEGIN SELECT * FROM #TempTable3 WHERE diffDateMinutes > @lateMoreThanMinutes AND employeeGroupId = @employeeGroupId ORDER BY startDate DESC, employeeName END ELSE BEGIN SELECT * FROM #TempTable3 WHERE diffDateMinutes > @lateMoreThanMinutes ORDER BY startDate DESC, employeeName END
DROP TABLE #tempTable3
Og smid så et svar og tak for den tilføjelse du lige kom med - den havde jeg ikke selv lige tænkt nok igennem...For ja om 3 år fra nu - så er tabellen jo nok temmelig stor *griner*
Hvad virker bedst...at true med at sætte mig på dig eller kysse dig (jeg er en "gammel" tyk trunte til din information)...altså for at få dig til at smide et svar? *griner*
i min første select vil performance mæssigt være forfærdelig - nu laver jeg så en select, hvor jeg henter måske 20 rækker og så laver jeg min Convert på de 20 rækker....
Resten af de tempTables jeg har, fordi jeg hver gang, jeg forsøgte at lave en WHERE på det jeg dannede - f.eks. newDate, gik i fejl og sagde, at den ikke eksisterede....
altså når jeg forsøgte mig med:
SELECT employeeId,employeeName,employeeGroupId, isActive, startHours, startMinutes, startDate, regStartDate, timeStampId, employeeGroupName, CONVERT(DATETIME, CONVERT(VARCHAR(10), startDate, 120) + ' ' + CONVERT(VARCHAR(2), startHours) + ':' + CONVERT(VARCHAR(2), startMinutes) + ':00') AS newDate FROM de forskellige tabeller WHERE startDate > newDate
Her fik jeg så at vide, at newDate ikke eksisterede....
Jeg kan ikke ændre designet. Det er afhængigt af ting, jeg får udefra systemet, som jeg ingen indflydelse har på overhovedet.
Noget jeg har overvejet i stedet.....
Ville det være smartere og ikke mindst hurtigere at smide det ind i C# delen - altså trække den første select ud - så snakker vi som skrevet om max 20 rækker, og så laver de efterfølgende ting i C# i stedet for at lave dem i SQL delen? ville det optimere perfomance?
Hvis du ved det altid er få altal rækker, så kan det være en fordel.
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.