1
votes

Date complète varchar à ce jour

J'ai besoin de convertir un champ varchar, à ce jour.

Mon varchar ressemble à ceci:

DATE(STR_TO_DATE(my_field, '%b %d %H:%i:%s +0000 %Y'))

J'ai besoin de:

SELECT DATE_FORMAT(STR_TO_DATE(my_field, '%b %d %H:%i:%s +0000 %Y'), '%Y-%m-%d') FROM my_tableLIMIT 1;
+--------------------------------------------------------------------------
----------+
| DATE_FORMAT(STR_TO_DATE(my_field, '%b %d %H:%i:%s +0000 %Y'), '%Y-%m-%d') |
+--------------------------------------------------------------------------
----------+
| NULL                                                                           
|
+-------------------------------------------------------------------------
----------+
1 row in set, 1 warning (0.00 sec)

Des idées?

J'ai essayé avec:

SELECT STR_TO_DATE(date_field, '%Y') FROM my_table LIMIT 1;
+---------------------------------------+
| STR_TO_DATE(date_field, '%Y-%m-%d')   |
+---------------------------------------+
| NULL                                  |
+---------------------------------------+
1 row in set, 1 warning (0.00 sec)

mais cela renvoie NULL.

EDIT - PLUS DE DÉTAILS:

Requête (string data_field) :

 SELECT date_field FROM my_table LIMIT 1;
+--------------------------------+
| date_field                     |
+--------------------------------+
| Tue Jan 11 17:18:53 +0000 2011 |
+--------------------------------+
1 row in set (0.00 sec)

J'ai essayé:

DATE_FORMAT(STR_TO_DATE(my_field, '%Y-%m-%d'), '%Y-%m-%d') mydate 

// Autre requête

2011-01-11

------- MODIFIER FINAL -------

SOLUTION !! YEYYY !!

Dans la réponse de @paul, il me recommande d'essayer ceci:

 Jan 11 17:18:53 +0000 2011 

Et cela fonctionne correctement! P >

Message pour tous les responsables de projets et développeurs:

NE JAMAIS enregistrer les dates dans les champs varchars SVP !!!!

Merci à tous!


7 commentaires

Que fait le +0000 et que se passe-t-il s'il est +0010 (par exemple)


Je ne sais pas mais si c'est nécessaire, coupez cette partie de la ficelle. J'ai besoin de la date au format AAAA-mm-jj


Jan est 01 et non 06 . Soit vous voulez dire Jun , soit le résultat doit être 2011-01-11 .


J'ai essayé STR_TO_DATE (REPLACE (my_field, '+0000', ``), '% Y-% m-% d') mais retourne NULL


J'ai corrigé la date @PaulSpiegel mon mauvais ..


Que ce soit une leçon pour ne JAMAIS stocker un champ de date comme varchar.


@Eric Je suis développeur externalisé sur ce projet, c'est une pratique HORRIBLE, je sais! :(


4 Réponses :


-1
votes

Vous pouvez utiliser la requête suivante pour obtenir le résultat requis:

select TO_DATE('Jan 11 17:18:53 +0000 2011', 'Mon DD HH24:MI:SS +0000 YYYY')


Pour plus de formateurs, vous vous référez au lien suivant:
https://www.postgresql.org/docs/9.0/functions-formatting. html


1 commentaires

La question est taguée avec mysql.



2
votes

Si la partie +0000 est toujours la même et n'a pas d'importance, vous pouvez utiliser:

Specifier | Description
----------|------------
       %b | Abbreviated month name (Jan..Dec)
       %d | Day of the month, numeric (00..31)
       %H | Hour (00..23)
       %i | Minutes, numeric (00..59)
       %s | Seconds (00..59)
       %Y | Year, numeric, four digits

Les spécificateurs utilisés ici sont:

DATE(STR_TO_DATE(my_field, '%b %d %H:%i:%s +0000 %Y'))

Voir la liste complète des spécificateurs dans la documentation sous DATE_FORMAT ()


5 commentaires

J'ai essayé ceci mais renvoie NULL SELECT DATE (STR_TO_DATE (mon_field, '% b% d% H:% i:% s +0000% Y'))


@AlexisCervetto Comment pourrais-je connaître % a ? Il n'y avait rien sur le jour de la semaine dans la version originale de votre question.


Je ne sais pas pourquoi hier% a fonctionné pour moi. En ce moment, j'exécute ma requête SQL et c'est vrai ..% b est correct, j'ai lu la documentation de DATE_FORMAT () et est l'attribut correct ... tellement fou!


Omg ... j'ai trouvé le problème X_X. J'ai deux formats de "dates" différents, comme "Tue Jan 11 17:18:53 +0000 2011" et "2011-10-03T18: 08: 21.000Z"


"J'ai deux" formats "de dates" différents - Félicitations ;-)



0
votes

Je ne pense pas que +0000 soit un nombre fixe. donc j'utiliserais

Select STR_TO_DATE('Jan 11 17:18:53 +0000 2011','%b %e %H:%i:%s +%f %Y')


2 commentaires

% f -> Microsecondes (000000..999999) J'ai plus le sentiment que +0000 indique les fuseaux horaires


% f fonctionne également avec des nombres à 4 chiffres. Mais le fuseau horaire est une bonne idée



1
votes
SELECT DATE_FORMAT(STR_TO_DATE('Jan 11 17:18:53 +0000 2011 ', '%b %d %H:%i:%s +0000 %Y'), '%Y-%m-%d'); 

1 commentaires

Veuillez ajouter quelques explications à votre réponse pour aider les autres à mieux la comprendre. Les réponses codées uniquement sont considérées comme impolies et peuvent ne pas aider le PO à comprendre le problème que vous essayez de résoudre.