Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

select mit aktuellem Datumsvergleich

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von datenmaus, 21 August 2012.

  1. datenmaus

    datenmaus Benutzer

    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
     
  2. Tommi

    Tommi Datenbank-Guru

    Hallo,

    versuchs mal hiermit:

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

    datenmaus Benutzer

    Hallo Tommi,

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

    Tommi Datenbank-Guru

    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
     
  5. datenmaus

    datenmaus Benutzer

    Hallo Tommi,

    super vielen Dank.
    Bin seit gestern hier angemeldet und total begeistert.

    Danke und liebe Grüße
     
    PLSQL_SQL und Walter gefällt das.
  6. datenmaus

    datenmaus Benutzer

    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
     
  7. Tommi

    Tommi Datenbank-Guru

    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
     
    ukulele und Walter gefällt das.
  8. datenmaus

    datenmaus Benutzer

    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ß
     
  9. Tommi

    Tommi Datenbank-Guru

    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
     
    ukulele, PLSQL_SQL und Margit gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden