Announcement

Collapse
No announcement yet.

trigger mit datum und bigint

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

  • trigger mit datum und bigint

    Hallo an alle,

    ich hoffe ihr könnt mir helfen.

    Ich habe eine datenbank mit einem feld date_modified als bigint.
    Damit ich dieses Feld auch von aussen ansprechen kann, brauche ich es aber als datetime oder timestamp, damit erspare ich mir teilweise extrem mühsame konvertierungen in php (Das wird bei uns verwendet).

    Dazu möchte 2 trigger schreiben (insert und update) die nach insert oder update dieses feld auslesen und ein ein feld date_new als datetime oder timestamp einfügen.

    Bisher bin ich soweit gekommen:
    Code:
    ALTER trigger [dbo].[tDatumIns] on  [dbo].[DOCUMENTS] after insert as
    begin
     set nocount on;
     
     if (columns_updated()>0)
      declare @dat bigint;
      select @dat = (select ins.date_modified from inserted ins);
      declare @x bigint;
      select @x=datediff(s,'19700101',dateadd(d,0,GETDATE()));
      select @x=@x*1000;
      declare @nDat datetime;
      select @nDat=cast(@x as datetime)
      update documents set datum_mod=@x where date_modified=@dat
    end
    Ich bekomme allerdings immer den Fehler
    Meldung 8115, Ebene 16, Status 2, Zeile 68
    Arithmetic overflow error converting expression to data type datetime.

    Nun bin ich mit meinem (kleinen) Latein ersteinmal am Ende.


    Was habe ich übersehen, bzw. bin ich vielleich überhaupt völlig am Holzweg?

    Danke
    Enigmus

  • #2
    Hallo Enigmus,

    ich fürchte, das musst Du etwas mehr kommentieren, damit auch ein anderer ausser Dir das versteht, was Du da machen möchtest.

    Du bildest die Differenz zwischen heute und dem 1.1.70 in Sekunden, multipizierst da drauf 1000 (= Millisekunden) und willst das dann direkt in DateTime konvertieren?

    Was genau soll dabei heraus kommen?

    Übrigens, der Aufbau des Triggers kann prinzipiell schon schief gehen; ein Trigger wird je Transaktion gezündet, nicht je Datensatz.
    In "inserted" kann als mehr als ein Datensatz stehen.
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      - warum eine Abfrage auf columns_updatet() bei einem reinen Insert-Trigger?
      - dateadd(d,0,GETDATE())) liefert genau dasselbe wie getdate() ...
      - selbst wenn "@nDat =cast(@x as datetime)" funktionieren sollte - wozu das alles? Datum ist ein Floatwert, der Ganzzahlteil bestimmt die Tage, du verwendest dabei allerdings "Sekunden ab 1.1.1970 bis jetzt" x 1000, das würde ein Datum in ca. 3,5 Milliarden Jahren ergeben

      meine Analyse: Holzweg der holzigsten Art

      bye,
      Helmut

      Comment


      • #4
        Erstmal danke für eure Antworten,

        ich glaube ich muss etwas weiter ausholen.

        Wir haben in einer Tabelle ein Feld date_modified, das als bigint definiert ist. Dort wird per java ein Datum in Millisekunden (als long) eingetragen.
        Das ist der Teil den ich nicht ändern kann.

        Nun möchte ich aber, dieses Datum per odbc (aus einer php-Anwendung heraus) auslesen, wobei aber lauter unsinn rauskommt.

        Dabei habe ich mir gedacht, dass es wohl am brauchbarsten wäre, wenn ich dieses date_modified per trigger in ein weiteres Feld das als datetime oder timestamp definiert ist, eintrage.

        Die Details dieser Abfrage habe ich von der Firma die diese Datenbank entworfen hat, in der Hoffnung dass was brauchbares dabei rauskommt. Allerdings gibt es dort mittlerweile keinen mehr, der von dieser Tabelle noch eine Ahnung hat (wurden alles vor einiger Zeit wegrationalisiert).

        Danke
        Enigmus

        Comment


        • #5
          Hallo Enigmus,

          jetzt muss Du nur noch raus finden, was diese "Millisekunden" darstellen sollen.
          Das Statement oben sieht danach aus, das es die Differenz zum 1.1.'70 ist.

          Das kannst Du dann so umwandeln:
          [highlight=SQL]DECLARE @datumdiff bigint;
          SET @datumdiff = 1261554000000;

          SELECT DATEADD(s, @datumdiff / 1000, CONVERT(datetime, '19700101'))[/highlight]
          Ergebnis:
          [highlight=code]-----------------------
          2009-12-23 07:40:00.000[/highlight]
          Wenn Deine aktuellen Werte in dem Bereich liegen, könnte es passen.

          Bei DateAdd wird als Wert max int erwartet, deshalb die Division. Werten die Werte größer, musst Du mit Minuten rechnen oder auf eine andere Datumsbasis umrechnen.
          Olaf Helper

          <Blog> <Xing>
          * cogito ergo sum * errare humanum est * quote erat demonstrandum *
          Wenn ich denke, ist das ein Fehler und das beweise ich täglich

          Comment


          • #6
            Hallo Olaf,

            vielen Dank, dein Stücken Code hat mit auf die Sprünge geholfen. Das Problem lag eigentlich woanders.

            Ich musste beim Vergleich des Inhalts von date_modified mit meinen Milisekunden diesen durch 1000 dividieren, damit ich ihn vergleichen kann.

            Vielen Dank an alle!
            Enigmus

            Comment

            Working...
            X