Announcement

Collapse
No announcement yet.

T-SQL DateTime und weiteres

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • T-SQL DateTime und weiteres

    Hallo Zusammen,

    bin neu hier und hoffe sehr das mir hier vielleicht wer Tipps//Anregungen gibt.

    Vorab: Ich habe leider recht wenige MSSQL/SQL Erfahrungen, haben vor Ewigkeiten mal ein wenig mit PHP und MYSQL gearbeitet aber das wars.

    Nun stehe ich leider für mich vor einer kleinen Herausforderung. Über eine Software werden unsere Ein und ausgehende Anrufe in einer MS SQL 2008 DB protokolliert. Leider ist die Software der letzte ****, es ist mir z.B. mit dieser nicht möglich Filter zu setzen die einen Zeitraum aus bzw. eingrenzen.

    Nun habe ich mir gedacht, ich erstelle eine weitere DB und kopiere Nachts immer alle Relevanten Informationen (die SW Protokolliert leider auch jede Menge unsinn) und eine neue DB. Dies habe ich nun auch schon mit folgenden T-SQL Code über das Management Studio geschafft:

    PHP Code:
    /****** Skript für SelectTopNRows-Befehl aus SSMS  ******/  
    /**** leeren der Aktuellen Tabelle 
      Truncate table [NeueDB].[dbo].[InCall] ****/

    /**** Einfügen der nicht angenommen anrufe****/  
      
    INSERT INTO NeueDB.dbo.InCall(IDWochentagAnrufdauerDWTypDatumAbgelehntUhrzeit)
    SELECT [lPKId]
        ,[
    sGiorno_c]
          ,[
    dDurata]
          ,[
    sDerivato]
          ,[
    sTipo]
          ,[
    dGatewayDateTime]
          ,[
    sEsitoChiamata_c]      
          ,[
    dGatewayDateTime]      
      
    FROM [AlteDB].[dbo].[Chiamate]
      
    where [AlteDB].[dbo].[Chiamate].[dGatewayDateTimeLIKE '%2011%' and sTipo 'I' and sEsitoChiamata_c '0';
     
    /**** Einfügen der angenommen anrufe ****/  
      
    INSERT INTO NeueDB.dbo.InCall(IDWochentagAnrufdauerDWTypAngenommenDatumUhrzeit)
    SELECT [lPKId]
        ,[
    sGiorno_c]
          ,[
    dDurata]
          ,[
    sDerivato]
          ,[
    sTipo]
          ,[
    sEsitoChiamata_c]
          ,[
    dGatewayDateTime]
          ,[
    dGatewayDateTime]      
      
    FROM [AlteDB].[dbo].[Chiamate]
      
    where [AlteDB].[dbo].[Chiamate].[dGatewayDateTimeLIKE '%2011%' and sTipo 'I' and sEsitoChiamata_c '1'
    Kurz zur Erklärung:

    sTipo = Eingehender oder Ausgehender Anruf; I = incomming O = outgoing
    sEsitoChiamata_c = Angenommen/nicht angenommen; 1 = angenommen 0= nicht angenommen


    dGateway ist leider ein DateTime Format. Dazu gleich mehr.


    Nun möchte ich gerne via Excel auf diese Datenbank zugreifen und mit Pivot Tabellen arbeiten. Dies ist auch soweit kein Problem, jedoch habe ich hier wieder das Problem das ich die Zeiten nicht eingrenzen kann (zb alle eingehenden Anrufe die nicht zwischen 9:00 und 17.30Uhr liegen).

    Ich denke mir mal das liegt an diesem DateTime Format und würde dies gerne Splitten und dem entsprechend auf die neue DB Verteilen.
    Kann mir hier vielleicht wer sagen wie ich das am besten mache?
    Hab schon ein paar Beispiele im Internet gefunden, konnte damit jedoch mangels an Erfahrung nichts mit anfange. Ich gehe auch davon aus das man meinen oben genannten SQL Code verbessern könnte, aber er funktioniert ^^

    Hoffe mir kann wer weiter helfen,

    Vielen Dank,
    Skalldem

    EDIT: Hab noch eine Alternative gefunden mit Datepart. Jedoch habe ich hier das Problem das ich nicht verstehe wie ich Stunde und Minute angeben kann, was leider sehr wichtig ist. Hier gerade das Beispiel:

    PHP Code:
    SELECT [Datum]
        ,[
    DW]
        ,[
    Wochentag]
      
    FROM [NeueDB].[dbo].[InCall]
      
    where DATEPART (HOURDatumnot between '9' and '17' and DATEPART (YEARDatumlike '%2011%' and Abgelehnt '0'
      
    Order by 'Wochentag'
    Wie kann ich das nun machen das unter NotBetween '9:00' and '17:30' stehen kann? Ich weiß ich kann DatenPart (HOUR, MINUTE, Datum) angeben, aber weiß nicht wie ich dann wie where Klauses gestalten muss....
    Zuletzt editiert von skalldem; 31.08.2011, 11:37.

  • #2
    Hi,

    grundsätzlich hast du es richtig gemacht.

    Würde aber an deiner Stelle nicht mit between arbeiten.

    Code:
    SELECT [Datum]
        ,[DW]
        ,[Wochentag]
      FROM [NeueDB].[dbo].[InCall]
      where DATEPART (HOUR, Datum) > '9' OR  DATEPART (HOUR, Datum)  <= '17' and DATEPART (YEAR, Datum) like '%2011%' and Abgelehnt = '0'
      Order by 'Wochentag';
    Hab nicht die besten Erfahrungen mit between gemacht.

    Vielleicht hilft dir das weiter.

    Gruss

    Michael
    http://www.mschnuerer.de

    Comment


    • #3
      Hi, Danke für deine Antwort. Habe gestern auch noch die Lösung aus vom SQLTEAM bekommen.

      SELECT [Datum]
      ,[DW]
      ,[Wochentag]
      FROM [NeueDB].[dbo].[InCall]
      WHERE CONVERT (TIME, Datum) BETWEEN '09:00' AND '17:00'
      AND DATEPART (YEAR, Datum) = 2011
      AND Abgelehnt = '0'
      ORDER BY [Wochentag];
      Damit kann ich dann auch die Minuten begrenzen (9:00->17.30. Und ich umgehe mein Problem das ich beim Operator (glaub zumindest das es einer ist) "like" keine - einbauen konnte (...like '%2011-08-%' geht zb nicht).

      VG und noch einen angenehmen Tag,
      skalldem

      Comment

      Working...
      X