select mit aktuellem Datumsvergleich

datenmaus

Benutzer
Beiträge
18
Hallo,
in meiner Datenbank, MS SQL Server 2008, gibt es das Feld lastchange (der Inhalt sieht so aus:
name / 21.12.2012 10:14:20)
Ich benötige nun einen select der auf dieses Feld geht und mir alle Datensätze des aktuellen Datums anzeigt.

Geht sowas?
so gehts, aber kann ja nicht jeden TAg das Datum eintragen:
select
*from meinetabellewherelastchangelike'%21.08.2012%'

Ich habe es mit einem Trigger versucht, aber dann habe ich probleme in der eigentlichen anwendung, warum auch immer.

Gruß und Danke
 
Werbung:

Tommi

Datenbank-Guru
Beiträge
284
Hallo,

versuchs mal hiermit:

SELECT
* frommeinetabellewherelastchangelike'%'+CONVERT(varchar(10),GETDATE(), 104)+'%'
 

datenmaus

Benutzer
Beiträge
18
Hallo Tommi,

ja super das klappt, danke.
Kannst du mir noch das auch erklären wie das zu verstehen ist.
Vielen Dank schon mal
 

Tommi

Datenbank-Guru
Beiträge
284
Hallo Datenmaus,

eigentlich ist das ganz einfach. Dein SELECT war ja schon vollkommen korrekt, ich habe das nur ein wenig erweitert, so dass mit der Funktion GETDATE() die aktuelle Systemzeit aufgerufen wird.
Da Du hier eine String-Auswertung durchführst, in dem das Datum die normale (deutsche) Format hat, habe ich mit dem CONVERT-Befehl diese in einen String (varchar) umgewandelt.
Der letzte Parameter im CONVERT-Befehl (hier die 104) steht bei einer Datums-Umwandlung für das Darstellungsformat.

Die möglichen Umwandlungsformate und weitere Infos findest du auch hier:
http://msdn.microsoft.com/de-de/library/ms187928(v=sql.90)

Viele Grüße,
Tommi
 

datenmaus

Benutzer
Beiträge
18
Hallo Tommi,

jetzt hab ich doch noch ein kleines Problem.
Diesen select führe ich in einer Sharepoint Liste aus.
Das hat natürlich zur Folge das die Liste jeden Tag gelert wird und nur die an dem Tag erstellen datensätze zu sehen sind.
Kann man den select ändern, so das ich eine komplette Woche abgefragt wird??

Oder wie ist das mit einem Trigger der eine Mail versendet, wie muss ich sowas aufbauen?
Habs probiert, bin aber kläglich gescheitert. War sogar so, das wenn mein Trigger aktiv war, konnte ich aus den Anwendung keinen neuen Artikel mehr anlegen.

Danke
 

Tommi

Datenbank-Guru
Beiträge
284
Hallo Datenmaus,

ich gehe mal davon aus, dass du das SELECT auf einer Tabelle ausführst, die als Grundlage für eine Sharepoint-Liste dient, ansonsten wäre das mit dem SELECT ja nur mit einen Zusatz-Tool möglich, und dann wäre meine Antwort wahrscheinlich nicht nutzbar!

Um Daten einer ganzen Woche anzuzeigen, gibt es für den von Dir beschriebenen Fall gleich zwei Möglichkeiten
1. Abfrage mit viel Schreibaufwand, aber stabil bezüglich Änderung des Datensatzaufbaus
2. Abfrage mit hohem Konvertierungsgrad, was aber dann anfällig ist gegen abweichende Syntax der Inhalte

Die erste Möglichkeit wäre, die WHERE-Klausel zu erweitern und mit der DATEADD-Funktion eine komplette Woche vor dem aktuellen Datum zu ermitteln
Das sähe dann so aus:

SELECT *FROM[meinetabelle]
WHERElastchangeLIKE'%'+CONVERT(varchar(10),GETDATE(), 104)+'%'
ORlastchangeLIKE'%'+CONVERT(varchar(10),DATEADD(day,-1,GETDATE()), 104)+'%'
ORlastchangeLIKE'%'+CONVERT(varchar(10),DATEADD(day,-2,GETDATE()), 104)+'%'
ORlastchangeLIKE'%'+CONVERT(varchar(10),DATEADD(day,-3,GETDATE()), 104)+'%'
ORlastchangeLIKE'%'+CONVERT(varchar(10),DATEADD(day,-4,GETDATE()), 104)+'%'
ORlastchangeLIKE'%'+CONVERT(varchar(10),DATEADD(day,-5,GETDATE()), 104)+'%'
ORlastchangeLIKE'%'+CONVERT(varchar(10),DATEADD(day,-6,GETDATE()), 104)+'%'

Das ist zwar Performance-Technisch nicht sehr schön, aber in jedem Fall stabil bei einer String-Auswertung.

Die zweite Möglichkeit kann einen Abfragefehler verursachen, wenn die Konvertierung des Strings fehlschlägt.
Die zweite möglichkeit sähe dann so aus (auch mit Abfangen eines möglichen Konvertierungsfehlers)


SELECT * FROM [meinetabelle] WHERE
(CASE WHEN ISDATE(REVERSE(RTRIM(REPLACE(LEFT(REVERSE(lastchange), CHARINDEX('/',REVERSE(lastchange) )),'/',''))))=1 THEN
CAST(REVERSE(RTRIM(REPLACE(LEFT(REVERSE(lastchange), CHARINDEX('/',REVERSE(lastchange) )),'/',''))) as datetime) ELSE NULL END)
BETWEEN CAST(CONVERT(varchar(10),DATEADD(day, -6, GETDATE()), 104) as datetime) AND GETDATE()


Über einen Trigger eine Mail zu versenden ist theoretisch zwar möglich, aber in der Praxis eher wenig sinnvoll.
Wenn du das wirklich benötigst, kann ich zwar ein Beispiel posten, aber es gibt wesentlich bessere Möglichkeiten als dies über einen Trigger zu lösen.

Ich hoffe, dass meine Antwort dich weiter bringt.
Viele Grüße,
Tommi
 

datenmaus

Benutzer
Beiträge
18
Hallo und schon mal Danke.
du schreibst das es da bessere Möglichkeiten gibt. Was wäre das denn.
Mir geht es darum immer zu erfahren wann ein neuer Datensatz angelegt wird, und mit welche Inhalt.

Danke und Gruß
 
Werbung:

Tommi

Datenbank-Guru
Beiträge
284
Hi,

mit "bessere Möglichkeit" meine ich keinen direkten Ersatz für eine Trigger-Auslösung.
Diese hat natürlich den Vorteil, dass bei jeder Änderung eine Info erfolgt - aber wer will das wirklich??
Wenn alle 2 Sekunden ein neuer Datensatz in die Tabelle geschrieben wird, erhält man auch alle 2 Sekunden eine Mail - ganz schön viel!!

Im allgemeinen reicht es ja aus, wenn man die Änderungen über einen bestimmten Zeitraum auswertet,
eine Abfrage der Datenänderung also zeitgesteuert und nicht datengesteuert vornimmt.
Hier wären allerdings andere Werkzeuge als der SQL Server selbst sinnvoller (geht aber auch mit dem SQL-Server, ist aber evtl. aufwändiger)

Um aber auf dem SQL Server zu bleiben: hier ist eine Beispiel-Prozedur, wie man eine Mail von Server aus versenden kann.
Dabei muss das Feature Datenbank eMail auf dem SQL-Server aktiviert und eine Mail-Profil eingerichtet sein.
Infos dazu findest Du hier:
http://msdn.microsoft.com/de-de/library/ms175887(v=sql.105).aspx

und hier ist die Prozedur:

CREATEPROCEDUREdbo.proc_SendeNeuerDatensatz
AS
DECLARE@Textnvarchar(max) -- Text der Mail
DECLARE@TOnvarchar(max) -- Mail-Adresse des Empfängers
DECLARE@Betreffnvarchar(255) -- Betreff der Mail
DECLARE@Prionvarchar(20) -- Prioritäten-Kennzeichnung (high, normal, low)

SET@Text='Neuer Datensatz am '+CONVERT(varchar(10),GETDATE(), 104)+' um '+CONVERT(varchar(20),GETDATE(), 108)
SET@Betreff='Neuer Datensatz'
SET@Prio='normal'
SET@TO='empfaenger@mail.de'

EXECmsdb.dbo.sp_send_dbmail@profile_name='<Profilname>'
,@recipients=@TO
,@subject=@Betreff
,@body=@Text
,@body_format='Text'

Diese Prozedur kannst Du natürlich mit dem Befehl EXEC dbo.proc_SendeNeuerDatensatz auch aus einem Trigger heraus starten.

Etwas komplexer wird das ganze, wenn du die eingefügten Daten mit in den Mailtext packen willst.
Das mußt Du dann noch zusätzlich vorbereiten und ergänzen.

Viele Grüße,
Tommi
 
Oben