timestamp

Begonnen von munzur, 10 Juli 2004, 14:50:27

⏪ vorheriges - nächstes ⏩

0 Mitglieder und 1 Gast betrachten dieses Thema.

munzur

hallo!

Copy von: http://dev.mysql.com/doc/mysql/de/DATETIME.html
Meine Frage die timestamp in user_lastvisit ist zb so: 1089463683 ich find nicht raus was :   'YYYY-MM-DD HH:MM:SS' ist!

Danke

 

7.2.2.2 Die DATETIME-, DATE- und TIMESTAMP-Typen

Die DATETIME-, DATE- und TIMESTAMP-Typen sind verwandt. Dieser Abschnitt beschreibt ihre Charakteristiken, wo sie sich ähnlich sind und wo sie sich unterscheiden.

Der DATETIME-Typ wird benutzt, wenn Sie Werte brauchen, die sowohl Datums- als auch Zeitinformationen beinhalten. MySQL ruft DATETIME-Werte ab und zeigt sie an im 'YYYY-MM-DD HH:MM:SS'-Format. Der unterstützte Wertebereich ist '1000-01-01 00:00:00' bis '9999-12-31 23:59:59'. (``Unterstützt'' heißt, dass frühere Werte zwar funktionieren können, dass es aber keine Garantie dafür gibt.)

Der DATE-Typ wird benutzt, wenn Sie nur einen Datumswert brauchen, ohne Zeitanteil. MySQL ruft DATE-Werte ab und zeigt sie an im 'YYYY-MM-DD'-Format. Der unterstützte Wertebereich ist '1000-01-01' bis '9999-12-31'.

Der TIMESTAMP-Typ ist ein Typ, den Sie dafür benutzen können, um INSERT- oder UPDATE-Operationen mit dem aktuellen Datum und der aktuellen Zeit zu stempeln. Wenn Sie mehrfache TIMESTAMP-Spalten haben, wird nur die erste automatisch aktualisiert.

Die automatische Aktualisierung der TIMESTAMP-Spalte geschieht unter einer der folgenden Bedingungen:

Die Spalte wird in einem INSERT- oder LOAD DATA INFILE-Statement nicht explizit angegeben.
Die Spalte wird in einem UPDATE-Statement nicht explizit angegeben, aber ein anderer Spaltenwert ändert sich. (Beachten Sie, dass ein UPDATE, das eine Spalte auf einen Wert setzt, den diese bereits hat, nicht dazu führt, dass die TIMESTAMP-Spalte aktualisiert wird, weil MySQL das Aktualisieren in einem solchen Fall auf Effizienzgründen ignoriert.)
Wenn Sie die TIMESTAMP-Spalte explizit auf NULL setzen.
TIMESTAMP-Spalten abgesehen von der ersten können ebenfalls auf das aktuelle Datum und die aktuelle Zeit gesetzt werden. Setzen Sie die Spalte einfach auf NULL oder auf NOW().

Sie können jede TIMESTAMP-Spalte auf einen Wert setzen, der vom aktuellen Datum und der aktuellen Zeit abweicht, indem Sie sie explizit auf den gewünschten Wert setzen. Das gilt sogar für die erste TIMESTAMP-Spalte. Sie können diese Eigenschaft benutzen, wenn Sie einen TIMESTAMP auf das aktuelle Datum und die aktuelle Zeit setzen wollen, wenn Sie eine Zeile erzeugen, nicht aber, wenn die Zeile später aktualisiert wird:

Lassen Sie MySQL die Spalte setzen, wenn die Zeile erzeugt wird. Das initialisiert sie auf das aktuelle Datum und die aktuelle Zeit.
Wenn Sie nachfolgende Aktualisierungen anderer Spalten in der Zeile durchführen, setzen Sie die TIMESTAMP-Spalte explizit auf ihren aktuellen Wert.
Auf der anderen Seite finden Sie vielleicht mindestens so einfach, eine DATETIME-Spalte zu benutzen, die Sie auf NOW() initialisieren, wenn die Zeile erzeugt wird, und die Sie bei nachfolgenden Aktualisierungen nicht anfassen.

TIMESTAMP-Werte haben einen Wertebereich von 1970 bis irgendwann im Jahr 2037, bei einer Auflösung von einer Sekunde. Werte werden als Zahlen angezeigt.

Das Format, in dem MySQL TIMESTAMP-Werte abruft und anzeigt, hängt von der Anzeigebreite ab, wie in der obigen Tabelle dargestellt. Das `volle' TIMESTAMP-Format ist 14 Ziffern, aber TIMESTAMP-Spalten können mit kürzeren Anzeigebreiten angelegt werden:

Spaltentyp  Anzeigeformat  
TIMESTAMP(14)  YYYYMMDDHHMMSS  
TIMESTAMP(12)  YYMMDDHHMMSS  
TIMESTAMP(10)  YYMMDDHHMM  
TIMESTAMP(8)  YYYYMMDD  
TIMESTAMP(6)  YYMMDD  
TIMESTAMP(4)  YYMM  
TIMESTAMP(2)  YY  

Alle TIMESTAMP-Spalten haben dieselbe Speichergröße, unabhängig von der Anzeigebreite. Die gebräuchlichsten Anzeigebreiten sind 6, 8, 12 und 14. Sie können zur Zeit der Tabellenerzeugung beliebige Anzeigebreiten festlegen, aber Werte von 0 oder größer als 14 werden auf 14 gesetzt. Ungerade Werte im Bereich von 1 bis 13 werden auf die nächst höhere gerade Zahl gesetzt.

Sie können DATETIME-, DATE- und TIMESTAMP-Werte mit folgenden Formaten festlegen:

Als eine Zeichenkette im 'YYYY-MM-DD HH:MM:SS'- oder 'YY-MM-DD HH:MM:SS'-Format. Eine ``entspannte'' Syntax ist zugelassen - jedes Satzzeichen kann als Begrenzer zwischen Datumsanteilen oder Zeitanteilen verwendet werden. Beispielsweise sind '98-12-31 11:30:45', '98.12.31 11+30+45', '98/12/31 11*30*45' und '98@12@31 11^30^45' äquivalent.
Als eine Zeichenkette im 'YYYY-MM-DD'- oder 'YY-MM-DD'-Format. Auch hier ist eine ``entspannte'' Syntax zugelassen. Beispielsweise sind '98-12-31', '98.12.31', '98/12/31' und '98@12@31' äquivalent.
Als eine Zeichenkette ohne Begrenzer im 'YYYYMMDDHHMMSS'- oder 'YYMMDDHHMMSS'-Format, vorausgesetzt, die Zeichenkette ergibt als Datum einen Sinn. '19970523091528' und '970523091528' beispielsweise werden als '1997-05-23 09:15:28' interpretiert, aber '971122129015' ist unzulässig (es hat einen Minutenanteil, der keinen Sinn ergibt) und wird in '0000-00-00 00:00:00' umgewandelt.
Als eine Zeichenkette ohne Begrenzer im 'YYYYMMDD'- oder 'YYMMDD'-Format, vorausgesetzt, die Zeichenkette ergibt als Datum einen Sinn. '19970523' und '970523' werden als '1997-05-23' interpretiert, aber '971332' ist unzulässig (es hat einen Monatsanteil und einen Tagesanteil, der keinen Sinn ergibt) und wird in '0000-00-00' umgewandelt.
Als eine Zahl im YYYYMMDDHHMMSS- oder YYMMDDHHMMSS-Format, vorausgesetzt, die Zahl ergibt als Datum einen Sinn. 19830905132800 und 830905132800 zum Beispiel werden als '1983-09-05 13:28:00' interpretiert.
Als eine Zahl im YYYYMMDD- oder YYMMDD-Format, vorausgesetzt, die Zahl ergibt als Datum einen Sinn. 19830905 und 830905 zum Beispiel werden als '1983-09-05' interpretiert.
Als Ergebnis einer Funktion, die einen Wert zurückgibt, der in einem DATETIME-, DATE- oder TIMESTAMP-Zusammenhang einen Sinn ergibt, wie NOW() oder CURRENT_DATE.
Unzulässige DATETIME-, DATE- oder TIMESTAMP-Werte werden in den ``0''-Wert des jeweiligen Typs umgewandelt ('0000-00-00 00:00:00', '0000-00-00' oder 00000000000000).

Bei Werten, die als Zeichenketten angegeben werden, die Begrenzer für Datumsanteile enthalten, ist es nicht notwendig, zwei Ziffern für Monats- oder Tageswerte anzugeben, die weniger als 10 sind. '1979-6-9' ist dasselbe wie '1979-06-09'. Gleichermaßen ist es bei Zeichenketten, die Begrenzer für Zeitanteile enthalten, nicht notwendig, zwei Ziffern für Stunden-, Monats- oder Sekundenwerte anzugeben, die weniger als 10 sind. '1979-10-30 1:2:3' ist dasselbe wie '1979-10-30 01:02:03'.

Werte, die als Zahlen angegeben sind, sollten 6, 8, 12 oder 14 Ziffern lang sein. Wenn die Zahl 8 oder 14 Ziffern lang ist, wird angenommen, dass sie im YYYYMMDD- oder YYYYMMDDHHMMSS-Format ist und dass das Jahr durch die ersten 4 Ziffern angegeben wird. Wenn die Zahl 6 oder 12 Ziffern lang ist, wird angenommen, dass sie im YYMMDD- oder YYMMDDHHMMSS-Format ist und dass das Jahr durch die ersten 2 Ziffern angegeben wird. Zahlen, die nicht diesen Längen entsprechen, werden interpretiert, als ob sie mit führenden Nullen auf die nächst mögliche Länge gebracht worden wären.

Werte, die als nicht begrenzte Zeichenketten angegeben werden, werden interpretiert, indem ihre Länge als gegeben angenommen wird. Wenn die Zeichenkette 8 oder 14 Zeichen lang ist, wird angenommen, dass das Jahr durch die ersten 4 Zeichen angegeben wird. Ansonsten wird angenommen, dass das Jahr durch die ersten 2 Zeichen angegeben wird. Die Zeichenkette wird von links nach rechts interpretiert, um die Jahres-, Monats-, Tages-, Stunden- und Sekundenwerte zu finden, für so viele Anteile, wie in der Zeichenkette vorkommen. Das bedeutet, dass Sie keine Zeichenketten benutzen sollten, die weniger als 6 Zeichen haben. Wenn Sie zum Beispiel '9903' angeben, in der Annahme, dass das März 1999 darstellt, werden Sie feststellen, dass MySQL einen ``0''-Datumswert in Ihre Tabelle einfügt. Das liegt daran, dass die Jahres- und Monatswerte 99 und 03 sind, aber der Tagesanteil fehlt (0), so dass der Wert kein zulässiges Datum darstellt.

TIMESTAMP-Spalten speichern zulässige Werte mit der vollen Genauigkeit, mit der der Wert angegeben wurde, unabhängig von der Anzeigebreite. Das hat mehrere Auswirkungen:

Geben Sie immer Jahr, Monat und Tag an, selbst wenn Ihre Spaltentypen TIMESTAMP(4) oder TIMESTAMP(2) sind. Ansonsten wäre der Wert kein zulässiges Datum und 0 würde gespeichert werden.
Wenn Sie ALTER TABLE benutzen, um eine enge TIMESTAMP-Spalte breiter zu machen, werden Informationen angezeigt, die vorher ``versteckt'' waren.
Gleichermaßen führt das Verengen einer TIMESTAMP-Spalte nicht dazu, dass Informationen verloren gehen, ausser in dem Sinn, dass weniger Informationen dargestellt werden, wenn die Werte angezeigt werden.
Obwohl TIMESTAMP-Werte mit voller Genauigkeit gespeichert werden, ist die einzige Funktion, die direkt mit dem zugrunde liegenden gespeicherten Wert arbeitet, UNIX_TIMESTAMP(). Alle anderen Funktionen arbeiten mit dem formatierten, abgerufenen Wert. Das bedeutet, Sie können keine Funktionen wie HOUR() oder SECOND() benutzen, wenn nicht auch der relevante Teil des TIMESTAMP-Werts im formatierten Werte enthalten ist. Wenn zum Beispiel der HH-Teil einer TIMESTAMP-Spalte nicht angezeigt wird, wenn die Anzeigebreite nicht mindestens 10 beträgt, wird der Versuch, HOUR() auf kürzere TIMESTAMP-Werte anzuwenden, unsinnige Ergebnisse erzeugen.
Bis zu einem gewissen Grad können Sie einem Objekt eines Datumstyp Werte eines anderen Datumstyps zuweisen. Jedoch kann eine Änderung des Wertes oder ein Informationsverlust eintreten:

Wenn Sie einem DATETIME- oder TIMESTAMP-Objekt einen DATE-Wert zuweisen, wird der Zeitanteil im Ergebniswert auf '00:00:00' gesetzt, weil der DATE-Wert keine Zeitinformationen enthält.
Wenn Sie einem DATE-Objekt einen DATETIME- oder TIMESTAMP-Wert zuweisen, wird der Zeitanteil des Ergebniswerts gelöscht, weil der DATE-Typ keine Zeitinformationen speichert.
Denken Sie daran, dass DATETIME-, DATE- und TIMESTAMP-Werte zwar in denselben Formaten angegeben werden können, dass die Typen jedoch nicht alle denselben Wertebereich haben. TIMESTAMP-Werte zum Beispiel können nicht früher als 1970 oder später als 2037 sein. Das bedeutet, dass ein Datum wie '1968-01-01', was als DATETIME oder DATE-Wert zulässig wäre, kein gültiger TIMESTAMP-Wert ist und in 0 umgewandelt wird, wenn er einem solchen Objekt zugewiesen wird.
Seien Sie auf der Hut vor Fallstricken, wenn Sie Datumswerte angeben:

Das entspannte Format läßt Werte als Zeichenketten zu, die täuschen können. Ein Wert wie '10:11:12' zum Beispiel sieht wegen des `:'-Begrenzers wie ein Zeitwert aus, wird er aber in einem Datums-Zusammenhang benutzt, wird er als das Datum '2010-11-12' interpretiert. Der Wert '10:45:15' wird in '0000-00-00' umgewandelt, weil '45' kein zulässiger Monat ist.
Jahreswerte, die als zwei Ziffern angegeben werden, sind mehrdeutig, weil das Jahrhundert unbekannt ist. unknown. MySQL interpretiert 2-stellige Jahreswerte nach folgenden Regeln:
Jahreswerte im Bereich 00 bis 69 werden in 2000 bis 2069 umgewandelt.
Jahreswerte im Bereich 70 bis 99 werden in 1970 bis 1999 umgewandelt.
 

"Debug-Mode" einschalten.
"SQL-Fehler anzeigen" einschalten
und evt. auftauchende Fehlermeldungen posten .

sascha

Hallo Munzur

'YYYY-MM-DD HH:MM:SS'
zb. '2004-07-10 20:26:56'

Y=Jahr
YYYY=Jahr 4 stellig (2004)
M=Monat
MM=Monat 2 stellig (07)
D=Tag
DD=Tag 2 stellig (10)

Dasgleiche:
H=Stunden
M=Minuten
S=Sekunden

Meintest DU das ?
Thanks Sascha

munzur

nein :)

sag mir die zeit und datum von dem hier:   1089463683 ist meine reg time auf meiner seite!

l.g
"Debug-Mode" einschalten.
"SQL-Fehler anzeigen" einschalten
und evt. auftauchende Fehlermeldungen posten .

sascha

Die Tabele user_regtime ist keine Datums Zeit bezogener Eintrag.

 http://dev.mysql.com/doc/mysql/de/Numeric_types.html Eintrag TYP INT.

Im Module User_Registration in der Index.php steht
 $user_regtime = time();
 

und time() Gibt den aktuellen Unix-Timestamp zurück, d.h. die Anzahl der Sekunden seit dem 1.1.1970, 0:00 Uhr (Beginn der Unix-Epoche). Grundlage ist Systemzeit des Servers.

Ich nehme jetzt an das dieser Eintrag user_regtime 1.1.1970 + 1089463683 sekund ist = dein Registrations Datum?

Weiss nicht ob das so nachvollziehbar ist.
Thanks Sascha


munzur

sry mir ist ein fehler unterlaufen ich wolte eigentlic sagen das es   user_lastvisit ist und nciht user_regtime

danke
"Debug-Mode" einschalten.
"SQL-Fehler anzeigen" einschalten
und evt. auftauchende Fehlermeldungen posten .

Juliet

Hi munzur,

ich könnte DIr das ganze "umgekehrt" anbieten:
 <?PHP
  // mktime(stunde,minute,sekunde,monat,tag,jahr);
  echo mktime(0,00,00,11,27,2002);
?>  
Eine php-Datei damit erstellen, Deine gewünschte Zeit eintragen und dann die Datei im Broser aufrufen ...
Hilft Dir leider im MOment wenig, denk ich.

munzur

hi!

ich wollte eigentlich aus der db die leute raus hauen die seit 5 monaten nciht mehr auf der seite waren. und deswegen die   user_lastvisit

Leider steht da kein datum denn ich nutzen kann oder sonnst was woraus ich erkenne was älter als 5 monate ist!

wollte das machen: UPDATE `mx_users` SET user_stat='-1' WHERE user_lastvisit<'?????????????'

l.g
"Debug-Mode" einschalten.
"SQL-Fehler anzeigen" einschalten
und evt. auftauchende Fehlermeldungen posten .

Juliet

Ähm,

wie benuzt Du dazu nicht  dieses "User erinnern"-Modul?

Aber eigentlich hilft Dir meine DAtei dann doch.
Gib doch einfach das Datum von vor 5 MOnaten ein ...  dann haste den entsprechenden Zahlencode dazu und kannst Deinen sql-Befehl ausführen, oder?

edit:
der 11.02.2004 0:00:00 Uhr wäre demnach: 1076454000 - aber ohne Gewähr!

[Editiert am 10/7/2004 von Juliet]

sascha

So wie die Zahl aussieht ist es aber dei gleiche Berechnung.
Wie user_regtime.

1089463683 = 10.07.2004 ca. 14.00 Uhr mit dem Taschenrechner grob ausgerrechnet.

Es gibt sicher noch eine Befehl der Dir das genau sagen kann.
Thanks Sascha

Juliet

Ja, grob - etwas später wirds gewesen sein.
10.07.2004 genau 14 Uhr wäre dann 1089460800

Homicide

nimm die aktuelle Zeit  "time()" und ziehe von der einfach die 5 monate ab

ein Tag hat 86400 Sekunden
macht bei 5 monaten 86400 x (5 Monate (150 Tage) = 12960000
aktuelle Zeit minus 12960000, dann vergleichst du user_lastvisit mit der errechneten Zeit und ist die Zahl in user_lastvisit kleiner als die errechnete dann ist er länger als 150 Tage nicht dagewesen.

Also
$aktuell =time();
$vergangenheit = $aktuell-12960000;
if($user_lastvisit <= $vergangenheit) {
 löschen wir den User
}


jubilee

Ohhh warum so kompliziert.
php hat doch eigens funktionen um einen Timestamp in korrektes Datum/Zeit umzurechnen
---->   date ()

  date ("d m, Y H:i", 1089463683)
ergibt
  10 07, 2004 14:48

MfG
jubilee

jubilee

Nochwas :
@juliet bei mktime () KEINE!! führenden nullen eingeben !!
Wen es einstellige Werte sind bei Tag, Monat, Stunde, Minute
keine Führenden Nullen davorschreiben um die Werte zweistellig zu machen. Das kann mktime nicht ab und fängt an falsch zu rechnen.
Hier hatten wir das Problem schon mal :
 http://www.pragmamx.org/modules.php?name=eBoard&file=viewthread&tid=9966#pid53390
MfG
jubilee

Homicide

Wenn ich nur 5 Monate zurückrechnen will, um user die solange nicht mehr da waren zu löschen, brauch ich doch erst garnicht das Datum ausgeben.
Das wird nur interessant wenn ich vorher eine Abfrage mache und mir die Zeiten genau anzeigen lassen möchte, um danach dann einzeln zu selektieren wer gelöscht wird und wer nicht. Oder sehe ich das falsch?


[Editiert am 12/7/2004 von Homicide]

jubilee

Hallo !
@Homicide: Im Prinzip richtig.
Wollte nur darauf hinweisen, das es einfachere Methoden gibt, als
60X60X24X bla bla zu rechen.
Wenn du den timestamp von einer bestimmten Zeit haben möchtest,
nimmst Du mktime (0,0,0,monat,tag,jahr).
MfG
jubilee

[Editiert am 12/7/2004 von jubilee]

Homicide

@jubilee: Stimmt schon, aber ich dachte das bei den antworten hier einige grundlegende Sachen unklar waren, und da erklärt es sich besser wenn man versteht was da passiert als wenn man nur eine Funktion hat die es für einen macht. So lernt man die funktion auch verstehen.

In der Praxis sollte man dann schon die date() funktion nutzen.

Andi

Joho :)

warum verwendet ihr nicht die von mysql bereitgestellten Datumsfunktionen?

http://dev.mysql.com/doc/mysql/de/Date_and_time_functions.html

Funktionen
- PERIOD_ADD(P,N)
- PERIOD_DIFF(P1,P2)
- ADDDATE(datum,INTERVAL ausdruck typ)
- SUBDATE(datum,INTERVAL ausdruck typ)
schön´s Grüssle, Andi

Homicide

 :genau:  ist eigentlich die beste lösung :)

Musicman75

Hallo,

bei mir werden alle User, wenn sie sich registrieren als Regdatum auf
1.1.1970 gesetzt, wo und wie kann ich das ändern?

Unaufgeforderte Support PMs & Emails werden ignoriert

Immer erst die Boardsuche verwenden und gegebenenfalls einen neuen Threat eröffnen, wenn das Problem noch nicht behandelt wurde!