Von einem Datum einen Tag abziehen

Tompson

Level-1
Beiträge
40
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich möchte von einem Datum (Datentyp Date) einen Tag abziehen.

z.B.:
D#2008-2-26 einen Tag abziehen--> D#2008-2-25

Natürlich unter Berücksichtigung von Monats- und Jahreswechsel.
Also aus dem D#2008-1-1 soll der D#2007-12-31 werden.

Ist das möglich oder gibt es da vielleicht sogar schon eine Funktion von Siemens für?
 
Date-Format bezeichnet die Anzahl der Tage seit dem 1.1.1990

d.h. wenn du einen Tag abziehen willst dann gehts ganz einfach mit
ner INTEGER Subtraktion

L #Datum
L 1
-I
T #Datum_neu
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ja dann musst du dass Date_and_Time_Format auftrennen abziehen und dann wieder zusammenfügen.
ABer wie kriegst du den aus dem Datum (Int Zahl) das Monat und den Tag raus?
Die Formel is sicher auch Komplex (30,31,29,28 Tage)....
 
ja dann musst du dass Date_and_Time_Format auftrennen abziehen und dann wieder zusammenfügen.
ABer wie kriegst du den aus dem Datum (Int Zahl) das Monat und den Tag raus?
Die Formel is sicher auch Komplex (30,31,29,28 Tage)....

:confused: in welcher parallelwelt bist du denn unterwegs?

es ging eindeutig ums format date! ... das ist ein 16bit-wert, dazu noch ein elementarer datentyp, wenn du ihn dir dezimal anguckst, so wie sarek geschrieben hat, zeigt er die tage seit 1.1.1990 (= 0int) ...

date_and_time ist ein zusammengesetzter datentyp. die auflösung in die einzelnen werte kannst du von hand machen oder mit hilfe von IEC funktionen. oder selber basteln http://sps-forum.de/showpost.php?p=171541&postcount=11
 
Zuletzt bearbeitet:
ok, ich hab da was verwechselt. Im Augenblick arbeite ich mit der CPU Zeit und hab das mit meiner Anwendung vermischt.

Ja und weiter? Also du hast dann irgendeinen Zahlenwert. Wie kommst du auf das monat und den Tag des Monats? Das wollt ich damit eigentlich sagen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Format DATE ist nur eine bestimmte Darstellung eines Integer-Wertes:

DATE

Eine Variable mit Datentyp DATE (Datum) wird in einem Wort als vorzeichenlose Festpunktzahl abgelegt. Der Inhalt der Variablen entspricht der Anzahl der Tage seit 01.01.1990. Die Darstellung enthält das Jahr, den Monat und den Tag, jeweils getrennt durch einen Bindestrich.

Beispiele:

DATE#1990-01-01 (= INT 0000)

DATE#2009-14-01 (= INT 6953)

DATE#2009-13-01 (= INT 6952)

Gruß Kai
 
Ja und weiter? Also du hast dann irgendeinen Zahlenwert. Wie kommst du auf das monat und den Tag des Monats? Das wollt ich damit eigentlich sagen.

wofür brauchst du das? wenn du den elementaren Datentypen DATE verwendest, so wird er von den entsprechenden funktionen auch als solches gedeutet, auch von visualisierungssystemen.

darüber hinaus:
date als dez / 360 = jahr (rest: x)
x/30 = monat (rest: y)
y + 1 = tag

müßte hinhauen, mußte allerdings als DINT rechnen, weil date als vorzeichenlose ganzzahl daher kommt ...
 
Wir haben eine Funktion geschrieben, die aus unseren Anlagen den Tagesverbrauch an Wasser der letzten 14 Tage abspeichert.
Dafür schaut die Funktion auf das letzte im DB gespeicherte Datum und vergleich es mit dem aktuellen. Ist es nicht mehr gleich (also immer um 0:00h), wird eine Routine einmal aufgerufen, die zuerst alle Verbräuche und Daten verschiebt, dann den neuen Tagesverbrauch berechnet, diesen abspeichert und das neue Datum hinzufügt.
Nur leider ist das ja nicht der Tagesverbrauch von heute sondern von gestern. Und daher will ich vor dem abspeichern des Datums einen Tag abziehen. Dann wäre alles OK.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Date-Format bezeichnet die Anzahl der Tage seit dem 1.1.1990

d.h. wenn du einen Tag abziehen willst dann gehts ganz einfach mit
ner INTEGER Subtraktion

L #Datum
L 1
-I
T #Datum_neu

Der Tip von Sarek scheint zu klappen. Habe gerade mal die Systemzeit auf den 01.01.2009 geändert und im DB steht jetzt der 31.12.2008.
Hätte nicht gedacht, daß das so einfach wäre.

D.h. in dem Dateformat der S7 sind schon alle Schaltjahre hinterlegt? Also er muß ja wissen, ob vor dem 1.3.2034 der 29. oder 28.02. war. Bis zu welchem Jahr denn?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das wäre zu einfach. ;)

Nein Quatsch. Die Funktion gibt es schon länger, nur ist der Fehler noch keinem aufgefallen. Und als ich das eben erfahren habe, habe ich soweit gar nicht gedacht, die Abfrage für den Routineaufruf einfach zu ändern.

Aber das werde ich wohl machen. Trotzdem ist es interessant zu wissen, daß das Datum eigentlich ein Int-Wert ist.
Danke noch mal.
 
Werde doch die
L 1
-I
Variante nehmen, da mir die Zeit da gar nicht zur Verfügung steht. Könnte sie natürlich auch noch aus der Variablen #Zeit_Tag ziehen, aber ich glaube, das das Abziehen eines Tages weniger Rechenaufwand ist.
 
die Zeit (TOD) kannst Du dir genau wie das Datum auslesen, nur halt mit dem FC8 DT_TOD. Sie hat 32bit länge und kann mit CMP <=> D ausgewertet werden.

Aber das nur ebenbei... einfacher ist sicher die von Dir gewählte -1 Variante.

Gruß
Sven_HH
 
Zurück
Oben