select format(concat('','3.5' * 1), 2); -- 3.50 select format(concat('','3,5' * 1), 2); -- 3.00
Benutzen INT:
-- multipliziert mit 1 -- kein leerer String -- nicht der String '0'. Prüft man nicht '0' sondern 0, wird auf empty geprüft. SELECT * FROM mydata where concat('',my_int_id * 1) <> my_int_id AND my_int_id <> '' AND my_int_id <> '0'; -- in UPDATE WHERE funktioniert das nicht --- in UPDATE WHERE kann man auch REGEXP nutzen SELECT * FROM mydata where TRIM(my_int_id) NOT REGEXP '^[0-9]+$' AND my_int_id <> '' AND my_int_id <> '0';
Benutzen FLOAT:
SELECT * FROM buydata where format(concat('',preis * 1), 2) <> preis AND preis <> '';
Das schlägt fehl wenn preis z.B. 3.0 ist.
oder
SELECT * FROM buydata where concat('',preis * 1) <> preis AND preis <> '';
Weiß man, dass nur das Komma (statt dem Punkt) das Problem ist, kann man mit LIKE ‚%,%‘ die Kommas umwandeln:
update buydata set preis = replace(preis, ',', '.') where preis like '%,%';
Oder mit Regex:
SELECT preis FROM buydata WHERE preis NOT REGEXP '^[0-9]+$';
Anschließend mit
ALTER TABLE `buydata` CHANGE COLUMN `preis` `preis` FLOAT NOT NULL DEFAULT 0 ;
aus den VARCHARs FLOATs machen.
Bei größeren Zahlen, wie z.B. Unixtime:
SELECT * FROM tablename where replace(replace(format(concat('',the_date), 0),',',''),'.','') <> the_date and the_date <> '';
Um ein DE Datum (01.01.1970) in einen Integer (Unixtime) zu verwandeln hilft folgende Funktion:
CREATE FUNCTION `func_deDatestringToUnixtime`(p_datestring TINYTEXT) RETURNS int(11) BEGIN declare day_string VARCHAR(2); declare month_string VARCHAR(2); declare year_string VARCHAR(4); declare sql_date_string VARCHAR(10); declare datetime_datetime DATETIME; declare datetime_int int(11); set day_string = SUBSTR(p_datestring, 1, 2); set month_string = SUBSTR(p_datestring, 4, 2); set year_string = SUBSTR(p_datestring, 7, 4); set sql_date_string = CONCAT_WS('-',year_string,month_string,day_string); set datetime_datetime = CONVERT(sql_date_string, DATETIME); set datetime_int = UNIX_TIMESTAMP(datetime_datetime); RETURN datetime_int; END
Vorbereitende Queries
UPDATE tablename SET columnname = TRIM(columnname);
…kann helfen wenn folgendes scheinbar nicht funktioniert:
SELECT columnname, concat( '', columnname * 1 ) FROM tablename where trim( concat( '', columnname * 1 ))<> columnname AND columnname <> '' AND columnname <> 0;