Datumsformat bei eigenen Feld ändern

Alles, was nicht in die anderen Foren passt, kannst du hier loswerden.
Antworten
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Datumsformat bei eigenen Feld ändern

Beitrag von Gerhard0964 »

Hallo,
ich habe da mal wieder eine Frage. Ich habe folgende Abfrage erstellt:
SELECT DATE_FORMAT( CURDATE( ) , '%Y' ) - DATE_FORMAT( 'Eintrittsdatum', '%Y' ) AS 'Mitgliedsdauer',`adm_users`.`usr_id` AS 'Mitglieds-ID', `usr_last_name` AS 'Nachname', `usr_first_name` AS 'Vorname', `usd_value` AS 'Eintrittsdatum'
FROM `adm_users`
RIGHT JOIN
`adm_user_data` ON `adm_users`.`usr_id`= `adm_user_data`.`usd_usr_id`
WHERE `usd_usf_id` = '7'
GROUP BY `usr_last_name` ASC
Damit möchte ich letztlich die Mitgliedsdauer auf einer Statistikseite auswerfen. Dies soll dann nach den Mitgliedsjahren 15 / 20 / 25 usw. erfolgen.

Leider komme ich garnicht erst soweit, da mir die Abfrage bei der Mitgliedsdauer "NULL" ausgiebt. Der Grund ist mir auch klar, ich habe im Feld "usd_value" der Tabelle "adm_user_data" das falsche Datumsformat nämlich 14.03.2008.

Meine Frage lautet jetzt:
Wie kann ich das Datum in der Tabelle der Schreibweise 2008-03-14 anpassen? Möglichst so, dass dies bereits beim Speichern geschieht.

Danke
Gerhard
Benutzeravatar
fasse
Administrator
Beiträge: 6228
Registriert: 12. Nov 2005, 16:06

Beitrag von fasse »

Hallo Gerhard,

ich habe gerade mal nachgeschaut, es müsste eigentlich mit folgender Funktion gehen:

Code: Alles auswählen

STR_TO_DATE(usd_value,'%d.%m.%Y')
Viele Grüße
Fasse
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

Hallo Fasse,
danke für die Funktion, wenn Du mir aber jetzt noch verrätst wo ich sie einbauen soll wäre das super.

Ich vermute mal, dass dies die richtige Seite ist:
adm_program/modules/profile/profile_new.php
Und dann an der markierten Stelle?
// Zurueck-Navigation und Haeckchen war bereits gesetzt
echo " checked ";
}
elseif($new_user == 0 && $row->usd_value == 1)
{
echo " checked ";
}
echo " value=\"1\" ";
}
else
{
if($row->usf_type == "NUMERIC")
{
echo " style=\"width: 80px;\" maxlength=\"15\" ";
}
elseif($row->usf_type == "TEXT" "."STR_TO_DATE(usd_value,'%d.%m.%Y'))
{
echo " style=\"width: 200px;\" maxlength=\"30\" ";
}
elseif($row->usf_type == "TEXT_BIG")
{
echo " style=\"width: 300px;\" maxlength=\"1000\" ";
}

if($b_history == true)
{
echo " value=\"". $form_values[$row->usf_id]. "\" ";
}
elseif(isset($row->usd_value) && strlen($row->usd_value) > 0)
{
echo " value=\"$row->usd_value\" ";
}
}
echo ">";
// Fragezeichen mit Feldbeschreibung anzeigen, wenn diese hinterlegt ist
Wäre das so richtig? Falls nicht, könntest Du mir bitte zeigen wo es hingehört, ich bin nicht so der Spezialist.

Danke!
Gruß
Gerhard
Benutzeravatar
fasse
Administrator
Beiträge: 6228
Registriert: 12. Nov 2005, 16:06

Beitrag von fasse »

Gerhard0964 hat geschrieben:Hallo Fasse,
danke für die Funktion, wenn Du mir aber jetzt noch verrätst wo ich sie einbauen soll wäre das super.
In deinem SQL-Statement oben bei dem Select des Eintrittsdatums. Da dies kein Datumsfeld ist, sondern ein Stringfeld, muss dort diese Funktion und nicht date_format angewandt werden. Erst nachdem es durch str_to_date ein Datum geworden ist, kann date_format angewendet werden !
SELECT DATE_FORMAT( CURDATE( ) , '%Y' ) - DATE_FORMAT(STR_TO_DATE('Eintrittsdatum', '%d.%m.%Y' ), '%Y') AS 'Mitgliedsdauer',`adm_users`.`usr_id` AS 'Mitglieds-ID', `usr_last_name` AS 'Nachname', `usr_first_name` AS 'Vorname', `usd_value` AS 'Eintrittsdatum'
FROM `adm_users`
RIGHT JOIN
`adm_user_data` ON `adm_users`.`usr_id`= `adm_user_data`.`usd_usr_id`
WHERE `usd_usf_id` = '7'
GROUP BY `usr_last_name` ASC
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

Alles klar, das ist kein Problem das so zu ändern. Ich dachte das müsste beim Schreiben in die DB bereits festgelegt werden.

Danke
Gruß
Gerhard
Benutzeravatar
fasse
Administrator
Beiträge: 6228
Registriert: 12. Nov 2005, 16:06

Beitrag von fasse »

Nee, wichtig ist halt nur, dass jetzt alle das Datum im selben Format angeben.
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

Ja das ist klar. Sind bei mir aber nur sehr wenige, da wir das Programm mehr zur Mitgliederverwaltung benutzen. Und da ist sehr hilfreich.

Gruß
Gerhard
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

Hallo Fasse,
sorry, aber ich bin erst Heute wieder dazu gekommen mich dieses Problems anzunehmen. Leider klappt der Code so nicht:
SELECT DATE_FORMAT( CURDATE( ) , '%Y' ) - DATE_FORMAT( STR_TO_DATE('`usd_value', '%d.%m.%Y'), '%Y' ) AS 'Mitgliedsdauer', `adm_users`.`usr_id` AS 'Mitglieds-ID', `usr_last_name` AS 'Nachname', `usr_first_name` AS 'Vorname', `usd_value` AS 'Eintrittsdatum'
FROM `adm_users`
RIGHT JOIN `adm_user_data` ON `adm_users`.`usr_id` = `adm_user_data`.`usd_usr_id`
WHERE `usd_usf_id` = '7'
GROUP BY `usr_last_name` ASC
Ich erhalte dann folgende Meldung wenn ich sie in PHP-Myadmin ausführe:
#1305 - FUNCTION db228372740.STR_TO_DATE does not exist
Ich habe schon bei MYSQL nachgelesen, bringt mich aber nicht wirklich weiter.

Wenn ich die Funktion über den Webserver ausführe erhlte ich die Meldung, dass es keine entsprechenden Mitglieder gibt.
Liegt es evtl. am verwendeten Datumsformat 03.04.1972?

Hast Du noch eine Idee?

Gruß
Gerhard
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

Ich habe jetzt mal nur diesen Code probiert:
SELECT DATE_FORMAT(STR_TO_DATE('usd_value', '%d.%m.%Y'), '%Y' ) AS 'Eintrittsdatum' FROM `adm_user_data`
mit demselben Ergebnis.
matzman2000
Former team member
Beiträge: 1087
Registriert: 2. Sep 2007, 17:12
Wohnort: Itzstedt
Kontaktdaten:

Beitrag von matzman2000 »

Hallo Gerhard,

um ein deutsches Datum in ein MySQL Datum umzuwandeln, nutze ich diese Funktion:

Code: Alles auswählen

 function date_date2mysql($date) {
  $date_array = explode(".", $date);
  return $date_array[2]."-".$date_array[1]."-".$date_array[0];
 }
Damit frage ich bei mir an einigen Stellen das Datum ab, bzw. gebe es an die DB weiter. Hoffe, das hilft bei Deinem Problem. :wink:

Gruss,
Matze
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

Hallo Matze,
nicht wirklich. Schau mal hier habe ich den kompletten Code:
<?php
//store to date scheint leider nicht zu funktionieren
$sql = 'SELECT `adm_users`.`usr_id` AS \'Mitglieds-ID\', `usr_last_name` AS \'Nachname\', `usr_first_name` AS \'Vorname\', DATE_FORMAT(STR_TO_DATE(\'Eintrittsdatum\', \'%d.%m.%Y\' ), \'%Y\') AS \'Eintrittsdatum\', YEAR( CURDATE( ) ) - YEAR( usd_value ) AS \'Mitgliedszeit\''
. ' FROM `adm_users`'
. ' RIGHT JOIN `adm_user_data` ON `adm_users`.`usr_id` = `adm_user_data`.`usd_usr_id`'
. ' WHERE `usd_usf_id` = \'7\''
. ' AND `usd_value` >0'
. ' AND YEAR( CURDATE( ) ) - YEAR( usd_value ) between 35 AND 40'
. ' GROUP BY `usd_value` DESC';
$result = mysql_query($sql);
if (!$result) {
echo "Anfrage ($sql) konnte nicht ausgeführt werden : " . mysql_error();
exit;
}
if (mysql_num_rows($result) == 0) {
echo "<b>Keine Mitglieder vorhanden.</b>";
}
while ($row = mysql_fetch_assoc($result)) {
echo "<b>{$row['Vorname']}</b> <b>{$row['Nachname']}</b> seit {$row["Eintrittsdatum"]}, das sind {$row["Mitgliedszeit"]} Jahre.<br>";
}
mysql_free_result($result);
?>
Das blau markierte ist mein Problem.
Da die Tabelle adm_user_data bei usd_value ein Varchar ist und alle möglichen Daten dort rein kommen, muss ich irgendwie das Eintrittsdatum da herausfiltern und in der Abfrage verwenden.
Genau da beginnt das Problem. Gäbe es für das Eintrittsdatum eine eigene Tabellenspalte hätte ich es da deutlich leichter. :wink:

Gruß
Gerhard
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

Ok, neuer Versuch:
SELECT DATE_FORMAT( `usd_usf_id` , '%d.%m.%Y' ) AS Eitrittsdatum
FROM `adm_user_data`
WHERE `usd_usf_id` = '7'
Gibt mir aber leider "NULL" aus. :evil:
Gerhard0964
Beiträge: 129
Registriert: 15. Dez 2007, 17:53

Beitrag von Gerhard0964 »

Geschafft - ich habe die Lösung:
SELECT (YEAR(CURDATE())-YEAR(usd_value)) - (RIGHT(CURDATE(),5)< RIGHT(`usd_value`,5)) AS 'Mitgliedszeit',`adm_users`.`usr_id` AS 'Mitglieds-ID', `usr_last_name` AS 'Nachname', `usr_first_name` AS 'Vorname', `usd_value` AS 'Eintrittsdatum'
FROM `adm_users`
RIGHT JOIN
`adm_user_data` ON `adm_users`.`usr_id`= `adm_user_data`.`usd_usr_id`
WHERE `usd_usf_id` = '7'
GROUP BY `usr_last_name` ASC
So wird das Datum richtig berechnet - auf den Tag genau.

GRuß
Gerhard
Antworten