Announcement

Collapse
No announcement yet.

Timestamp von UCT in MEZ ändern

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

  • Timestamp von UCT in MEZ ändern

    Moin moin, ist es möglich den Timestamp durch einen Befehl oder Anweisung
    um 2 Stunden hochzusetzen??Habe leider das Problem das meine Daten in UCT Zeit in die Datenbank abgelegt werden und diese eine Differenz um -2h zu unserer hat. Vielleicht weiß einer von euch ja eine Lösung,danke Jungs

    Matze

  • #2
    Hallo Matze,

    es gibt den DateAdd Befehl, um auf eine Datum/Uhrzeit eine Spanne drauf (oder runter) zu rechnen.

    SELECT GetDate(), DATEADD(hh, 2, GetDate()) AS Plus2

    Jetzt muss Du nur noch Sommer- und Winterzeit richtig berücksichtigen.
    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
      Dann muss ich ja aber alle halbe Jahr meine Datenbank wieder überarbeiten, je nachdem ob Sommer- oder Winterzeit gerade aktuell ist. Das wäre ja auch nicht so schön

      Comment


      • #4
        vielleicht kann mir jemand sagen wo und wie ich folgende Funktion in SQL einbinden muss damit sich diese auf meine Views anwednen läßt....

        create function dbo.get_local_datetime
        (@date datetime, @time_zone varchar(25))
        returns datetime as
        BEGIN
        declare @local_time datetime
        declare @offset_time int
        select @offset_time = offset from timezone_offsets _
        where @date between start_time_gmt and end_time_gmt and time_zone_id = @time_zone
        set @local_time = dateadd(ms, isnull(@offset_time,0), @date)
        return @local_time
        END

        Comment


        • #5
          wie ich folgende Funktion in SQL einbinden muss
          Das ist bereits ein CREATE Script, also einfach ausführen und mit

          SELECT dbo.get_local_datetime(...)

          verwenden
          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
            Ich hätte jetzt gedacht das ich die Funktion jetzt erst als Tabellen oder Skalarwertfunktion anlegen muss??Aber irgendwie haut das nicht so hin, kriege da immer ne Fehlermeldung

            Comment


            • #7
              Es wäre hilfreich, wenn Du uns dann noch die Fehlermeldung mitteilen könntest ...

              Ich tippe mal darauf, es liegt daran, das die Tabelle "timezone_offsets" bei Dir nicht existiert / angelegt wurde, die die Funktion verwendet.
              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


              • #8
                Also wenn ich die Funktion anlegen will und diese dann Analysiere bekomme ich keine Fehlermeldung. Wenn ich diese allerdings Ausführen möchte bekomme ich folgenden Fehler:

                Meldung 208, Ebene 16, Status 6, Prozedur get_local_datetime, Zeile 16
                Ungültiger Objektname 'dbo.get_local_datetime'.

                Comment


                • #9
                  Moin Olaf, ich denke du hattest Recht, die Funktion offset_time lag mir bis eben noch nicht vor, nun habe ich sie. Sie ist allerdings in Java programmiert...,gibt es nun eine Möglichkeit diese in SQL einzubinden??Danke

                  Comment


                  • #10
                    Nicht Funktion, sondern Tabelle; wenn die da (und gefüllt) ist funktioniert die UDF soweit.

                    So läuft es ohne Fehler; mangels Werte für Tabelle aber ohne richtiges Ergebnis:
                    [highlight=SQL]CREATE TABLE timezone_offsets
                    (start_time_gmt datetime, end_time_gmt datetime,
                    time_zone_id varchar(25), offset int)
                    GO

                    CREATE FUNCTION dbo.get_local_datetime
                    (@date datetime, @time_zone varchar(25))
                    RETURNS datetime as
                    BEGIN
                    DECLARE @local_time datetime
                    DECLARE @offset_time int

                    select @offset_time = offset
                    from timezone_offsets
                    where @date between start_time_gmt and end_time_gmt
                    and time_zone_id = @time_zone

                    set @local_time = dateadd(ms, isnull(@offset_time,0), @date)
                    return @local_time
                    END
                    GO

                    SELECT dbo.get_local_datetime(GETDATE(), 'Table ist eh leer')
                    GO
                    -- abräumen
                    DROP FUNCTION dbo.get_local_datetime
                    DROP TABLE timezone_offsets
                    GO[/highlight]
                    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


                    • #11
                      Super, soweit klappt das erstmal....
                      Problem ist jetzt allerdings, das mir nach dem ausführen das korrekte Datum als Ergebnis ausgegeben wird, allerdings wird das nicht in den Systemtabellen abgelegt. Hier ist jeweils noch die alte Zeit aktuell.
                      Gibt es außerdem ein Befehl mit den ich alle Tabellen ansprechen kann, ansonst müsste ich noch ein paar tausend Stück in die Funktion eintragen was nicht so schön wäre, danke aber schonmal für deine Mühe

                      Comment


                      • #12
                        Nein, einen Befehl gibt es dafür nicht.

                        Abgesehen davon, wenn die Daten in UTC gespeichert wurden, hatte das vermutlich auch so seinen Grund.
                        Auch solltest Du Dir über die Konsequenzen einer solchen Datenänderung klar sein.
                        Wenn Du 2 Datensätze in UTC hast, den ersten eine Minute vor der Sommerzeitumstellung und den zweiten eine Minute nach der Umstellung.
                        Wenn Du jetzt updates, dann liegt auf einmal der zweite DS zeitlich vor dem ersten (oder gibt es dann einen um eine Stunde höhere Differenz ... kann ich mir nicht merken).

                        Und aus dem Grunde verwendet man gerne UTC.

                        Übrigens, ab SQL Server 2008 wird UTC nativ besser unterstützt (z.B. Datentyp datetimeoffset), aber auch hier gibt man als Zeitzone z.B. "+02:00" an und nicht "MEZ".
                        Die Daten müssen also bereits mit dem zu dem Zeitpunkt gültigen Offset gespeichert werden.
                        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


                        • #13
                          Mir würde es ja reichen, wenn in der original Datenbank der alte Wert steht, ich mir mit hilfe einer View aber die gleichen Datensätze auslesen kann nur mit einem anderen Timestamp. Aber wie es scheint ist dies dann nicht möglich diesen auf die GMT Zeitzone anzupassen, schade

                          Trotzdem Dank an dich

                          Grüße Matze

                          Comment


                          • #14
                            So nun gehts, für alle die Interesse haben wie:

                            DATEADD(hh, { fn HOUR(DATEADD(ss, 10, GETDATE()) - GETUtcDate()) },
                            Timestamp) AS MEZ


                            Grüße

                            Comment


                            • #15
                              Wie Albert Einstein schon so schön sagte: "Alles ist relativ" und das funktioniert im wahrsten Sinne des Wortes relativ.

                              Es ermittel das heutige Datum nach lokaler Zeit und das heutige UTC Datum und bildet daraus die Differenz. Heute ergibt das somit +2:00, weil wir heute Sommerzeit haben.
                              Du willst aber auch Datumswerte+Uhrzeit aus dem Winter umrechnen, oder nicht?

                              Da hättest Du gleiche die Lösung aus meinem ersten Posting nehmen können.
                              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

                              Working...
                              X