2010-08-10 11 views
2

Je copie des données d'un fichier de csv à ma base de données (mysql) avec Java. J'ai une colonne de temps où les valeurs peuvent être h:mm:ss ou - h:mm:ss (le - signifie que nous avons dépassé un certain délai).comment convertir un varchar à l'heure en java?

donc j'ai été obligé de changer le type de colonne à varchar. Mon problème maintenant est que j'ai besoin de comparer la valeur des enregistrements dans cette colonne, par exemple je dois montrer tous les enregistrements où la valeur de cette colonne est inférieure à 30 min, sachant que la valeur du champ dépasse le format 24h (peut être 56:00:00).

Merci pour votre aide

Répondre

0

Je ne suis pas un expert Java dev, mais je sais en php ce que votre demande (si je comprends bien) peut être réalisé avec strtotime, afin d'utiliser cela comme une recherche, je trouvé ce fil.

PHP's strtotime() in Java

Espérons que cela aide.

1

Drop the [] et déplacez-le au champ de type TIME et vous devriez être bien

UPDATE tableName SET timeField = REPLACE(REPLACE(varCharField,'[',''),']','')

+0

J'ai déjà essayé mais ça n'a pas fonctionné – daria

+0

Qu'est-ce que tu as exactement y? – Mchl

+0

J'ai déjà omis le '[' et défini le type de données comme le temps, mais cela n'a pas fonctionné. J'ai oublié de vous dire que la valeur de temps n'est pas limitée à 0-23.Je peux avoir 56:00:00 valeur indiquant qu'il est de 7 jours ouvrables. – daria

1

Hye

Ce problème peut être résolu soit mise en données en temps dans une colonne et un Le drapeau booléen dans l'autre colonne du même enregistrement diffère entre '-' et non '- enregistrements que je suppose est un signe moins c'est en solution générale. Comme vous utilisez mysql où   vous pouvez définir les données directement avec '-' signe qui montre une valeur négative (temps datatype) dans la colonne et comme vous l'avez dit, vous devez les comparer avec des conditions comme 30 minutes (00: 30:00) etc vous pouvez utiliser subtime() ou addtime() syntaxe mysql à des fins de comparaison. J'espère que vous trouverez cette réponse appropriée.

concernant

la_89ondevg

3

convertissent plutôt à quelques secondes et le stocker sous forme d'un entier signé. Vous ne pouvez pas faire des opérations numériques directement sur des chaînes/varchars, il en coûterait très cher de le masser et de revenir au format utilisable. Alors pourquoi ne pas simplement le stocker directement dans ce format?

Voici un exemple de coup d'envoi comment convertir votre champ CSV à quelques secondes:

public static int toSeconds(String time) throws ParseException { 
    SimpleDateFormat positiveTime = new SimpleDateFormat("'['hh:mm:ss']'"); 
    SimpleDateFormat negativeTime = new SimpleDateFormat("'[-'hh:mm:ss']'"); 

    if (time.startsWith("[-")) { 
     return -1 * (int) negativeTime.parse(time).getTime()/1000; 
    } else { 
     return (int) positiveTime.parse(time).getTime()/1000; 
    } 
} 

Voilà comment vous pouvez l'utiliser et enfin stocker dans DB:

String time1 = "[00:00:30]"; 
String time2 = "[- 00:10:20]"; 

int time1InSeconds = toSeconds(time1); 
int time2InSeconds = toSeconds(time2); 

// ... 

preparedStatement = connection.prepareStatement("INSERT INTO tbl (col1, col2) VALUES (?, ?)"); 
preparedStatement.setInt(1, time1InSeconds); 
preparedStatement.setInt(2, time2InSeconds); 

Pour sélectionner les périodes de plus de 30 secondes, juste faire comme:

SELECT col1, col2 FROM tbl WHERE col1 > 30 
Questions connexes