22. maj 2006 - 11:09Der er
20 kommentarer og 1 løsning
Konvertere tekst til tidspunkt
Mit SQL Server job skal hver time check om der er indsat data i en given tabel indenfor den sidste time og sende en mail hvis betingelsen ikke er opfyldt. Jeg er nået frem til følgende kode, men kan ikke rigtigt få "formatteret" klokkeslæt ordentligt.
DECLARE @recipients_var as varchar(255), @subject_var as varchar(255), @message_var as varchar(255)
IF (SELECT Count(*) FROM [myDatabase].dbo.myTable WHERE Klokkeslæt > DATEADD("hh",-1,CONVERT(CHAR(19), "01-01-1900 " & RIGHT(GETDATE(),8),"mm/dd/yyyy hh:nn:ss"))) = 0
Set @recipients_var = 'modtager@domail.dk' Set @subject_var = 'Ingen data' Set @message_var = '<programnavn> er måske stoppet...'
Ovenstående kode bliver fint verificeret af SQL Query Analyzeren, men ved kørsel får jeg denne fejl:
Server: Msg 207, Level 16, State 3, Line 7 Invalid column name 'mm/dd/yyyy hh:nn:ss'. Server: Msg 207, Level 16, State 1, Line 7 Invalid column name '01-01-1900 '.
Jeg har rettet lidt i SELECT'en SELECT Count(*) FROM [myDatabase].dbo.myTable WHERE Klokkeslæt > DATEADD("hh",-1,CONVERT(CHAR(19), '01-01-1900 ' & RIGHT(GETDATE(),8),'mm/dd/yyyy hh:nn:ss')) som stadig ikke virker. Men når jeg bare forsøger med et tidspunkt SELECT Count(*) FROM [myDatabase].dbo.myTable WHERE Klokkeslæt > '01-01-1900 10:00:00' er der ingen problemer
/*konstruerer @TidNu som er 1/1 1900 med kokkeslæt fra GETDATE()*/ DECLARE @TidNu datetime SET @TidNu = DATEADD(d, DATEDIFF(d, GETDATE(), CONVERT(datetime, '1-1-1900', 105)), GETDATE())
/*Selecter hvor klokkeslæt er under en time gammel*/ SELECT Count(*) FROM [myDatabase].dbo.myTable WHERE DATEDIFF(hh, Klokkeslæt, @TidNu) < 1/*
Selecter hvor klokkeslæt er over en time gammel*/ SELECT Count(*) FROM [myDatabase].dbo.myTable WHERE DATEDIFF(hh, Klokkeslæt, @TidNu) >= 1
Klokkeslæt ER datetime Og jeg vil mene at Klokkeslæt ALTID er d. 1/1-1900. (der er tale om et Delphi program som indsætter et tidspunkt og der er vist ikke mulighed for at angive det andet end på formen hh:mm:ss
Det ser jo fint ud, så mangler jeg bare at få koblet dags dato på... SELECT Count(*) FROM myTable WHERE DATEDIFF(hh, Klokkeslæt, @TidNu) < 1 AND Dato = CONVERT(datetime, GETDATE(), 105) --Virker ikke...
Jeg synes ikke rigtigt jeg kan få hægtet "datoen" ordentligt på... IF (SELECT Count(*) FROM myTableWHERE DATEDIFF(hh, Klokkeslæt, @TidNu) < 1 AND Dato = CONVERT(varchar, GETDATE(), 102)) <= 0
En PRINT på linien DATEADD(d, DATEDIFF(d, GETDATE(), CONVERT(datetime, '1-1-1900', 105)), GETDATE()) viser Jan 1 1900 2:50PM men dataene i databasen er på dette format 01-01-1900 14:43:01
Klokkeslæt er et datetime felt, og de har ikke noget format. Det format du ser afhænger at den applikation du bruger. I virkeligheden er datetime en numerisk datatype, ikke tekst. Det er først når du beder om at se datoen at den bliver vist som en tekststreng.
Query Analyzer'en giver dig altså formatet Jan 1 1900 2:50PM, når du PRINT'er en datetime, @TidNu.
Det format du ser Klokkeslæt i er et resultat af den applikation du bruger til det, det er måske Enterprise Manager?
Prøv dette: DECLARE @test datetime SELECT TOP 1 @test = Klokkeslæt FROM myTable PRINT @test
Fejlen i sætningen (Dit indlæg 14:36:10) er at du mangler = 0.
Det skal være (ombrudt for læsevenlighed):
IF ( SELECT Count(*) FROM myTable WHERE DATEDIFF(hh, Klokkeslæt, @TidNu) < 1 AND DATEDIFF(d, Dato, GETDATE()) = 0 ) = 0
Det var selvfølgelig DET der var galt, ldanielsen! "Fejlen i sætningen (Dit indlæg 14:36:10) er at du mangler = 0." Så virker det, takker MANGE GANGE for hjælpen.
Hmmm....det virker og alligevel ikke helt. Jeg har oprettet et job som indeholder følgende kode:
USE [myDatabase] DECLARE @recipients_var as varchar(255), @subject_var as varchar(255), @message_var as varchar(255), @TidNu datetime
SET @TidNu = DATEADD(d, DATEDIFF(d, GETDATE(), CONVERT(datetime, '1-1-1900', 105)), GETDATE())
IF (SELECT Count(*) FROM myTable WHERE DATEDIFF(hh, Klokkeslæt, @TidNu) < 1 AND DATEDIFF(d, Dato, GETDATE()) = 0) = 0 BEGIN Set @subject_var = 'Ingen data!' Set @recipients_var = 'myMail@myDomain.dk' Set @message_var = 'Processen er måske stoppet...'
Hvis jeg bare afvikler jobbet, sendes der ingen mail (da programmet som checkes kører), men den schedule jeg har tilknyttet jobbet og som kører hver time, on the hour, den har sendt mail 2 gange nu, kl. 12 og 13!
Hvilken slags job er det vi taler om? Har du skrevet det direkte ind som job under SQL Server Agent?
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.