none
Wie baue ich eine Zeitmaschine? RRS feed

  • Frage

  • Hallo,

    - nur ein Scherz.

    aber ich möchte das Langzeitverhalten eine Programmes simmulieren,

    dazu ist es nötig beliebige timestamps zu generieren, die mit SP's mittels getdate() in die Tabelle eingetragen werden.

    Diese Routinen möchte ich nicht ändern.

    Meine Frage:

    Gibt es das Pendant setdate mit dem ich die aktuelle Zeit beliebig setzen kann, die getdate dann ließt?

    Danke

    Dienstag, 3. April 2012 09:34

Antworten

  • Hallo Michael,

    der SQL Server bezieht Datum/Uhrzeit vom Betriebssystem -> ein Setdate gibt es nicht.
    Und das System-Datum zu ändern ist keine gute Idee, da es alle Programme betrifft.

    Du kannst aber über eine Zufallsgenerierung beliebige Uhrzeiten erzeugen, z. B.:

    SELECT DATEADD(ss, RAND(BINARY_CHECKSUM(NEWID())) * 1000,GETDATE()) 
    FROM master..spt_values 
    WHERE type = 'P' AND number < 1000
    
    

    Oben sind es zufällige Sekunden im Bereich 0 - 1000, die auf die aktuelle Zeit addiert werden.
    Andere Bereiche (Minuten, Stunden, usw.) und Größen sind entsprechend erzeugbar.

    Willst Du die Werte "nur" streng aufsteigend reicht einfache Arithmetik.

    Gruß Elmar

    • Als Antwort markiert mimuel Dienstag, 3. April 2012 14:58
    Dienstag, 3. April 2012 11:24
    Beantworter
  • Nein, das solltest du nicht machen. Die korrekte Lösung ist imho deterministische Prozeduren zu schreiben, d.h. statt dem GETDATE() einen entsprechenden Parameter zu benutzen.
    • Als Antwort markiert mimuel Dienstag, 3. April 2012 14:57
    Dienstag, 3. April 2012 13:13
    Moderator

Alle Antworten

  • Hallo Michael,

    der SQL Server bezieht Datum/Uhrzeit vom Betriebssystem -> ein Setdate gibt es nicht.
    Und das System-Datum zu ändern ist keine gute Idee, da es alle Programme betrifft.

    Du kannst aber über eine Zufallsgenerierung beliebige Uhrzeiten erzeugen, z. B.:

    SELECT DATEADD(ss, RAND(BINARY_CHECKSUM(NEWID())) * 1000,GETDATE()) 
    FROM master..spt_values 
    WHERE type = 'P' AND number < 1000
    
    

    Oben sind es zufällige Sekunden im Bereich 0 - 1000, die auf die aktuelle Zeit addiert werden.
    Andere Bereiche (Minuten, Stunden, usw.) und Größen sind entsprechend erzeugbar.

    Willst Du die Werte "nur" streng aufsteigend reicht einfache Arithmetik.

    Gruß Elmar

    • Als Antwort markiert mimuel Dienstag, 3. April 2012 14:58
    Dienstag, 3. April 2012 11:24
    Beantworter
  • Hallo Elmar, danke für Deine Antwort - aber ein Zufallsdatum ist nur ein Teil meiner Lösung. Ich möchte in den SP's in denen die timestamp's stehen keine Änderungen vornehmen sonst ist es keine echte Simulation. Ich bin mir über die Gefahr einer Uhrzeitänderung im Klaren. Vermutlich muß ich in den SP's zwei Varianten eintragen eine mit getdata() und eine mit einer Zufallsdatum, die ich im Testfall aktiviere. Gruß Michael
    Dienstag, 3. April 2012 11:43
  • Nein, das solltest du nicht machen. Die korrekte Lösung ist imho deterministische Prozeduren zu schreiben, d.h. statt dem GETDATE() einen entsprechenden Parameter zu benutzen.
    • Als Antwort markiert mimuel Dienstag, 3. April 2012 14:57
    Dienstag, 3. April 2012 13:13
    Moderator
  • Schreib doch eine Funktion GETDATEEX().

    Ersetze in deinen SPs etc GETDATE() durch GETDATEEX().

    Nun kannst du GETDATEEX() manipulieren. Im Normalfall schleift sie nur GETDATE() durch. Für Testzwecke kann Sie dir auch beliebige Daten liefern ...

    Mittwoch, 4. April 2012 09:54
  • btw, der Ansatz intern im Testfall ein anderes Datum heranzuziehen bedeutet: Du hast nicht den eigentlichen Produktionscode getestet. Das ist offsichtlich nicht das Ziel, daher das Umschreiben der Prozedure als bessere Lösung.
    Mittwoch, 4. April 2012 14:53
    Moderator
  • Hallo Mimuel

    mimuel wrote:

    aber ich möchte das Langzeitverhalten eine Programmes simmulieren,

    dazu ist es nötig beliebige timestamps zu generieren, die mit SP's
    mittels getdate() in die Tabelle eingetragen werden.

    Diese Routinen möchte ich nicht ändern.

    Meine Frage:

    Gibt es das Pendant setdate mit dem ich die aktuelle Zeit beliebig setzen
    kann, die getdate dann ließt?

    Simulationen macht man am besten in virtuellen Maschinen.

    Leg eine virtuelle Maschine an und installiere darin den SQL Server.

    In der Virtuellen Maschine kannst Du nun beliebig das Systemdatum verändern. Evt. geht das auch mit einem xp_cmdshell aufruf, wenn Du das automatisieren willst.
    Der Vorteil der Virtualisierung liegt darin, dass Du damit nicht Dein echtes System gefährdest. Gerade Änderungen am Systemdatum können unerwünschten Nebenwirkungen auf Programme und Daten haben.

    Gruss
    Henry

    Donnerstag, 5. April 2012 09:34