helmuthelmut2000
Goto Top

Änderungsdatum einer Spalte in einer MSSQL2000 DB ausgeben

Hallo,
Ich bin neu hier und hoffe das ich mich auch richtig ausdrücke.

Ich habe ein Problem.
Ich habe eine DB auf einem mssql2000 Server mit ein paar Spalten.
Ein Web das mit FrontPage erstellt worden ist greift uaf die DB zu. Es werden Daten in die DB geschrieben
und wieder ausgelsesen. Das funktioniert alles sehr gut, bis auf eines und das ist mein
Problem. Das Datum. Eine Spalte habe ich mit der Erstellung die habe ich so gemacht:
Die Spalte heist Erhalten der Datentyp ist datetime Größe ist 8 und als Standardwert steht:
(convert(varchar(10),getdate(),4))
Da wird das Datum geschrieben.
1.Problem: Das Datum wird z.B. 2005 und nicht 05 geschrieben. Sollte aber doch so sein oder?
2.Problem: Wenn ich einmal in die Spalte etwas geschrieben habe oder was gelöscht habe
brauche ich auch wider das Datum. Oder das Datum in Erhalten sollte überschrieben oder
Aktuallisiert werden. Wie bring man das hin?
Vielleicht hat mir da jemand eine lösung ich werd da nehmlich schon fast wahnsinnig.

Danke.

Content-Key: 18781

Url: https://administrator.de/contentid/18781

Printed on: April 25, 2024 at 00:04 o'clock

Mitglied: 16640
16640 Nov 01, 2005 at 06:44:18 (UTC)
Goto Top
Es gibt da mehrere Möglichkeiten. Du wirst allerdings nicht um ein manuelles Updaten eines Feldes herumkommen. Einen System-Automatismus, um ein datetime-Feld zu aktualisieren, gibt es nicht.

Zuerst muss man differenzieren, ob Du wirklich das Zugriffsdatum eines Records brauchst, oder ob Du nur wissen musst, ob ein Record nach einem definierten Zeitpunkt verändert wurde.

Im letzteren Fall gibt es den Datentyp 'timestamp', der die DBTS (steht für DataBaseTimeStamp) der Datenbank in den Record stellt. Das geschieht automatisch bei jeder Änderung des Records. Du kannst dir einen Referenzwert über das einfache Statement 'select @@dbts' aus der aktuellen Datenbank holen. Sinn des ganzen ist, sich einen Zeitstempel zu einem bestimmten Zeitpunkt zu merken (z.B. letzter Export der Daten in eine CSV-Datei). Dazu legt man den per select geholten DBTS-Wert in einer Tabelle irgendwo ab. Bei dem nächsten Export braucht man dann nur die Sätze exportieren, die einen größeren DBTS-Wert als der Abgelegte haben - alle anderen Sätze sind nicht geändert worden. Danach dann den am Anfang der Exportroutine ermittelten neuen DBTS-Wert speichern und alles kann von vorn beginnen. Den DBTS-Wert uinbedingt am Anfang der Routine holen, damit Änderungen an den Daten während des Exports im nächsten Lauf mit einbezogen werden. Würde man den DBTS-Wert erst am Ende holen, würden Sätze, an denen während des Exports Änderungen gemacht wurden, nicht berücksichtigt.

Wenn Du allerdings das konkrete Datum brauchst, dann kannst Du nur Deine Prozeduren und Anwendungen so programmieren, dass sie das Feld mit dem jeweils aktuellen Wert updaten. Wenn allerdings mit externen Tools an einer Programmierung vorbei mit den Daten gearbeitet wird, oder auch mit einer Programmierung, auf die Du keinen Einfluss hast, dann wirst Du mit Triggern arbeiten müssen. Trigger sind Ereignisse, die ausgelöst werden, wenn inserts, updates oder deletes auf einer Tabelle ausgeführt werden. Wenn jemand z.B. ein Update auf einen Record macht, dann hast Du in dem zugehörigen Trigger die Möglichkeit, das Update zu prüfen. Der Trigger stellt Dir virtuelle Tabellen 'DELETED' und 'INSERTED' zur Verfügung. In dem 'DELETED' hast Du den Inhalt, wie er vor der Änderung war und in dem 'INSERTED' den Inhalt, wie er nach dem UPDATE sein würde. Du kannst nun in dem Trigger die Felder alle noch nach Deinem Willen ändern, und dabei dann z.B. auch das 'modified'-Feld aktualisieren.

Vielleicht trifft das eine oder andere auf Deine Situation zu und hilft Dir schon mal weiter. Wenn Du noch konkrete Hints benötigst, melde Dich einfach nochmal.

Gruß
dba
Mitglied: 16640
16640 Nov 01, 2005 at 08:02:35 (UTC)
Goto Top
Erklär nochmal genauer, was Du mit dem Datum für ein Problem hast.

convert(varchar(10),getdate(),4)
gibt ein Datum ohne Jahrhundert. Wenn Du das Jahrhundert haben willst, musst Du
convert(varchar(10),getdate(),104) 
schreiben.

Gruß
dba
Member: helmuthelmut2000
helmuthelmut2000 Nov 01, 2005 at 15:21:33 (UTC)
Goto Top
Hallo dba,
Danke erstmal für dein bemühen.
Problem mit dem convert(varchar(10),getdate(),4) und
convert(varchar(10),getdate(),104) ist, das er immer die
Jahrhundertzahl macht auch bei convert(varchar(10),getdate(),4).
Es ist aber auch so bei mir wenn ich das eingebe und speichere dann
setzt er mir das alles in Klammer.
So (convert(varchar(10),getdate(),4))
Ist da vielleicht was faul.

Kannst du mir vielleicht aus dem letzten Beitrag noch genauer den
Befehl 'select @@dbts' erklären.
Ich habe nähmlich schon mal mit einem update gearbeitet, dann
hat er immer nur 1.1.1900 gemacht.
Habe ich da auch was falsch gemacht.

Liegt das ganze vielleicht auch an meiner Version die ich
installiert habe. Ich habe jetzt gesehen da gibt es ein SP4
für den SQLServer2000. Ich habe aber leider nur ISDN und das
ist eine große Datenmänge. Aber wenn es hilft dann mach ich das mal.

Gruß
Helmut
Member: Biber
Biber Nov 01, 2005 at 20:06:38 (UTC)
Goto Top
Moin helmuthelmut2000,

ich versteh ja nicht viel von Datenbanken und will nicht rumchaotisieren, aber ein bisschen verwirrend ist das für mich schon. Du schreibst:
Das Datum. Eine Spalte habe ich mit der Erstellung die habe ich so gemacht:
Die Spalte heist Erhalten der Datentyp ist datetime Größe ist 8 und als Standardwert steht:
(convert(varchar(10),getdate(),4))
Da wird das Datum geschrieben.

Wenn ich es etwas Umformatiere, steht da doch:
- Die Spalte heist Erhalten
- der Datentyp ist datetime Größe ist .. vollkommen egal, wie groß der intern ist..
- und als Standardwert steht: (convert(varchar(10),getdate(),4))
**grübel.. sowas wie Now(), Date(), Heute() oder CURRENT_DATE, denke ich mal..

Also hast Du doch ohnehin ein Datum drin - wie immer der MS-SQLServer das intern in 8 Byte Länge umsetzen mag.. Dein Problem kann doch nur die Darstellung, die Formatierung sein, oder? An welcher Stelle brauchst du bzw. wo stören Dich denn die Jahrhundertwerte?
In der Anzeige auf der WebSite? Oder beim Vergleich von eingegebenen Formular-Datumswerten mit DB-Werten?
Oder bin ich total neben der Spur grade?

Echt verwirrt
Biber
Member: helmuthelmut2000
helmuthelmut2000 Nov 01, 2005 at 20:36:52 (UTC)
Goto Top
Hallo Biber,
Ja ich weis, aber das ist auf einer Seite im Intranet.
Die Seite hat viele Spalten und möchte ich so was wie das
Datum ziemlich klein halten. Und da würde das schöner aus-
schauen. Wenn ich das nicht hinbekomme ist das nicht ganz
so schlimm aber ich dachte wenn es die funktion schon gibt
mit der 4 und 104 dann mach ich das.
Wichtiger ist mir die andere sache mit dem änderungsdatum,
wenn du mir da eine lösung wüstest wär ich dir sehr dankbar.

Gruß
Helmut
Member: Biber
Biber Nov 01, 2005 at 21:04:27 (UTC)
Goto Top
Na ja, Helmut,
da kann ich dba wenig hinzufügen..
Wenn der passende und aktuelle Wert für ein datetime-Feld über ein "select @@dbts" ermittelbar ist, dann heißt der da halt so. Ich würde ihn auch nehmen, wenn er @f@r@i@t@z heißen würde. Oder Grzlging.

Du brauchst doch bloß in Deinem Update/Insert-Statement noch hinzufügen:

Update meineDb set Feld1 = bla,
Feld2 = blubb,
Feld29 = blubb,
Erhalten = @@dbts
where....

Biber
Mitglied: 16640
16640 Nov 02, 2005 at 06:27:54 (UTC)
Goto Top
Hi Biber,

der DBTS ist kein datetime-Wert, sondern ein Timestamp der jeweiligen Datenbank. Im Prinzip ist das nichts anderes, als ein Zähler, der bei jeder Schreiboperation auf die Datenbank hochgezählt wird. Das kann auch darin resultieren, dass bei einem Update auf eine Tabelle, von dem 100 Sätze betroffen sind, alle diese Sätze den gleichen timestamp-Wert erhalten.

Für die Antwort zum Rest des Threads muss ich erst noch ein wenig in mich gehen face-wink

Gruß
dba
Mitglied: 16640
16640 Nov 02, 2005 at 07:00:11 (UTC)
Goto Top
Hallo Helmut,

Jahrhundert-Formatierung:
select convert(varchar(10),getdate(),4)
select convert(varchar(10),getdate(),104)
Diese beiden Statements ergeben definitiv unterschiedliche Ausgaben im SQL-Query-Fenster, einmal ohne und einmal mit Jahrhundert. Ich weiss es zwar nicht definitiv, aber ich würde mit an Sicherheit grenzender Wahrscheinlichkeit vermuten, dass Frontpage das Datum nach eigenem Gutdünken formatiert und dann einfach das Jahrhundert wieder dransetzt. Vielleicht hast Du da in dem Seitenlayout noch Formatierungsmöglichkeiten für das Datenfeld.

@@DBTS
Wie ich Biber schon geschrieben habe, ist das nicht eine in irgendeiner Art verschlüsselte Zeitangabe, sondern einfach ein Zähler pro Datenbank, der die Schreiboperationen zählt.
Voraussetzung: Dein Datensatz hat eine Spalte vom Typ 'timestamp'
Du brauchst Dich dann zunächst um nichts weiteres kümmern. Beim Erzeugen eines Datensatzes wird diese Spalte automatisch gefüllt und bei jeder Änderung des Datensatzes automatisch aktualisiert.
Der 'timestamp#-Wert in den Datensätzen muss nicht eindeutig sein. Wenn eine Aktualisierung der Daten mehrere Sätze betrifft, dann erhalten alle von dieser Aktualisierung betroffenen Datensätze den gleichen neuen 'timestamp'-Wert.
Wenn Du Dir also den aktuellen 'timestamp'-Wert der Datenbank (select @@dbts) zu einem bestimmten Zeitpunkt holst und merkst, kannst Du später mit einem einfachen Befehl alle Datensätze selektieren, die seitdem geändert worden oder neu hinzugekommen sind (select * from tabelle where 'timestamp'-Feld > [gespeicherter DBTS-Wert])
Hier mal der logische Ablauf einer solchen Aktion (Export von Daten beispielsweise):
1. Exportfunktion starten
2. gespeicherten DBTS-Wert des letzten Exports holen
3. aktuellen DBTS-Wert der Datenbank holen und merken
4. Exportieren der Daten, die einen größeren 'timestamp' haben als der DBTS-Wert des letzten Exports  
5. wenn fehlerfrei, oben geholten altuellen DBTS-Wert speichern für nächsten Lauf

Ich hoffe, ich hab mich verständlich ausgedrückt - ist manchmal mein Problem face-wink - ansonsten nochmal fragen.

Übrigens sind mir einige Dinge noch nicht ganz klar. Du schreibst:
Es ist aber auch so bei mir wenn ich das eingebe und speichere
dann setzt er mir das alles in Klammer.
So (convert(varchar(10),getdate(),4))
Womit machst Du das? Du gibst in welchem Programm ein und speicherst wo?

Btw: Am fehlenden SP4 liegt dieses Verhalten definitv nicht.

Gruß
dba
Member: helmuthelmut2000
helmuthelmut2000 Nov 02, 2005 at 19:59:23 (UTC)
Goto Top
Hallo Biber,
Es geht mit dem Update hinzufügen.
Es wird aber nur das Datum 1.1.1900 00:00:05
ausgegeben. Wenn ich es mit Timestamp mache dann
kommt gar kein Datum.
Fällt dir noch was ein???

Gruß Helmut.
Member: helmuthelmut2000
helmuthelmut2000 Nov 02, 2005 at 20:00:37 (UTC)
Goto Top
Hallo,

Schom alles Probiert geht leider nicht.

Gruß Helmut
Member: Biber
Biber Nov 02, 2005 at 20:54:00 (UTC)
Goto Top
pfffffff...alles probiert *lacht*
Nun mal nicht so schnell aufgeben.

Zwei hätte ich noch und dba ist ja auch in der Nähe...

a) im Update/Insert
... set Erhalten = getdate()
Bringt das etwas? Ich hab zwar Datenbanken hier, aber keine M$SQLServer2000..

b) CONVERT(VARCHAR(8), mydatetime, 4) sollte IMHO "tt.mm.jj" liefern, wenn Du nicht bei Dir in den Ländereinstellungen (Systemsteuerung) alles übersteuerst. Dann da sollten ja die überall gültigen Datums-/Zeitformate unter Windows drinstehen, wenn ich das Konzept richtig verstanden habe.

Ansonsten verweise ich auf dba... ich hatte ja eigentlich nur eine Verständnisfrage.
Member: helmuthelmut2000
helmuthelmut2000 Nov 03, 2005 at 19:24:57 (UTC)
Goto Top
SUPER!!!

Das mit dem getdate() funktioniert, aber leider mit UHRzeit.
Wenn es geht gibts das auch nur als Datum?
CONVERT(VARCHAR(8), mydatetime, 4) geht leider nicht.

Gruß Helmut
Member: helmuthelmut2000
helmuthelmut2000 Nov 03, 2005 at 19:40:53 (UTC)
Goto Top
Alles klar.
Das mit der Jahreszahl das hab ich,
du hast recht gehabt.
In den Ländereinstellungen hab ich das hingekrigt.
Jetzt wär nur noch das mit der Uhrzeit mit
wenn es da noch was gibt.

Danke mal im vorraus.

Gruß Helmut
Member: Biber
Biber Nov 03, 2005 at 20:45:17 (UTC)
Goto Top
Nö, Helmut,
Tut mir Leid, aber datetime ist datetime und Persil bleibt Persil...
Wenn Dein Feld "Erhalten" ein Datetime-Datentyp ist, hat es nun mal Datum und Uhrzeit.
Ist so. Auch wenn bei uns nur "Euro" das gültige Zahlungsmittel ist, gehören Cent eben auch dazu.

Du könntest (theoretisch) natürlich bei jedem Schreiben in die DB die Stunden, Minuten und Sekunden auf Null setzen (sinngemäß also "03.11.2005 00:00:00"), aber das ist Quark.
Dann wäre es sogar sinnvoller (aber absolut gesehen auch Unsinn) statt einem Datumsfeld ein String-Feld namens "Erhalten" zu verwenden. Mit nur 8 Zeichen. "TT.MM.JJ".

Aber was solls - in der Anzeige taucht die Uhrzeit ja nicht auf.
Und wenn Du tatsächlich auf einen bestimmten Tag filtern willst, musst Du halt schreiben:

SELECT * FROM Helmut01 WHERE Erhalten BETWEEN
CONVERT(datetime, '03.11.2005 00:00:00', 104)
AND CONVERT(datetime, '03.11.2005 23:59:59', 104)
~~
bzw.
~~
SELECT * FROM Helmut01 WHERE Erhalten BETWEEN
CONVERT(datetime, '03.11.05 00:00:00', 4)
AND CONVERT(datetime, '03.11.05 23:59:59', 4)

Und, auch wenn ich mich wiederholen sollte, mit Datenbanken kenn ich mich gar nicht aus - ich hatte nur eine Rückfrage.

Grüße
Biber
Member: helmuthelmut2000
helmuthelmut2000 Nov 04, 2005 at 20:17:01 (UTC)
Goto Top
Hallo Biber,

Ich mach das in FrontPage, wie kann ich das machen das mir da nur das
Datum oder die 10 Stellen in einer Spalte angezeigt wird.

Gruß Helmut
Member: helmuthelmut2000
helmuthelmut2000 Nov 06, 2005 at 12:56:35 (UTC)
Goto Top
Hallo Biber,

Also das klappt jetzt alles sehr gut mit dem Datum schreiben.
Vielen dank erstmal an alle die da mitgeholfen haben, am nützlichsten
war das am schluß mit der getdate() funktion.
Jetzt muß ich nur noch das Problem lösen das mir nur das Datum
angezeigt wird. Wie mache ich das am besten? Muß ich da die Spaltenbreit
irgendwie begrenzen auf die 10Zeichen? Aber ich kann doch nur Prozentual
oder in Pixel das einstellen. Oder gibts da noch was ?

Auf jeden fall mal Danke

Gruß
Helmut