Avatar billede dougheffernan Nybegynder
22. maj 2006 - 11:09 Der 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...'

EXEC master..xp_sendmail
  @recipients = @recipients_var,
  @subject = @subject_var,
  @message = @message_var
Avatar billede dougheffernan Nybegynder
22. maj 2006 - 11:10 #1
Feltet Klokkeslæt indeholder f.eks. denne værdi:
01-01-1900 14:43:01
Avatar billede dougheffernan Nybegynder
22. maj 2006 - 11:11 #2
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 '.
Avatar billede dougheffernan Nybegynder
22. maj 2006 - 11:13 #3
Jeg skal selvfølgelig også have koblet et check af dags dato på. Værdien som der skal sammenlignes med ser sådan her ud:
22-05-2006
Avatar billede dougheffernan Nybegynder
22. maj 2006 - 12:23 #4
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
Avatar billede ldanielsen Nybegynder
22. maj 2006 - 13:07 #5
Er klokkeslæt datetime eller hvad?

Er datoen i Klokkeslæt altid 1. jan 1900?
Avatar billede ldanielsen Nybegynder
22. maj 2006 - 13:15 #6
/*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
Avatar billede dougheffernan Nybegynder
22. maj 2006 - 13:23 #7
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
Avatar billede dougheffernan Nybegynder
22. maj 2006 - 13:32 #8
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...
Avatar billede dougheffernan Nybegynder
22. maj 2006 - 13:36 #9
SÅ var den der, det skulle selvfølgelig være som varchar. Læg et svar, ldanielsen og få dine (velfortjente) point.
Avatar billede ldanielsen Nybegynder
22. maj 2006 - 13:44 #10
OK

Er det sådan at du har et varcharfelt der hedder Dato (Bare nysgerrig)?
Avatar billede dougheffernan Nybegynder
22. maj 2006 - 14:14 #11
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
Avatar billede dougheffernan Nybegynder
22. maj 2006 - 14:14 #12
Nej, feltet Dato er af typen smalldatetime.
Avatar billede dougheffernan Nybegynder
22. maj 2006 - 14:25 #13
Det er jo selvfølgelig datatypen på konverteringen der ikke er korrekt, men hvad skal den være for at give en dato på formen dd-mm-yyyy?
Avatar billede ldanielsen Nybegynder
22. maj 2006 - 14:30 #14
Hvis Dato skal være "i dag" vil jeg gøre sådan:

IF (SELECT Count(*) FROM myTableWHERE DATEDIFF(hh, Klokkeslæt, @TidNu) < 1 AND
DATEDIFF(d, Dato, GETDATE()) = 0
Avatar billede dougheffernan Nybegynder
22. maj 2006 - 14:36 #15
:(

Med
IF (SELECT Count(*) FROM myTable WHERE DATEDIFF(hh, Klokkeslæt, @TidNu) < 1 AND DATEDIFF(d, Dato, GETDATE())) = 0

får jeg en fejl i linien:
Incorrect syntax near ')'.
Avatar billede dougheffernan Nybegynder
22. maj 2006 - 14:58 #16
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
Avatar billede ldanielsen Nybegynder
22. maj 2006 - 22:39 #17
Undskyld afbrydelsen


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

Håber det kan hjælpe.
Avatar billede dougheffernan Nybegynder
23. maj 2006 - 10:51 #18
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.
Avatar billede ldanielsen Nybegynder
23. maj 2006 - 11:21 #19
Selv tak :o)
Avatar billede dougheffernan Nybegynder
23. maj 2006 - 13:14 #20
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...'

  EXEC master..xp_sendmail
    @recipients = @recipients_var,
    @subject = @subject_var,
    @message = @message_var
  END

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!

Hvorfor? Hvad gør jeg galt med scheduleringen?
Avatar billede ldanielsen Nybegynder
24. maj 2006 - 08:53 #21
Hvilken version af MSSQL er det?

Hvilken slags job er det vi taler om? Har du skrevet det direkte ind som job under SQL Server Agent?
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