Avec la chaîne DATETIME yyyymmddhhmmss comme 20160125173013, je voudrais convertir cette chaîne en hh:mm:ss (17:30:13) en tant que nouvelle colonne appelée "Time" dans une table avec instruction de mise à jour sql. Cependant, je ne peux le convertir qu'en 17h30 en utilisant la fonction stuff. Existe-t-il une solution possible pour convertir?

Dans ma déclaration

UPDATE db
SET Time =convert(time, stuff(substring(DATETIME,9,6),3,2,':'))
FROM db
WHERE Time IS NULL

Sortie réelle = 17:13:00.0000000

Mais ma sortie attendue est 17:13:00

Merci beaucoup!

0
CHAN TATA 25 janv. 2017 à 11:24

6 réponses

Meilleure réponse

Voici le miracle pour mysql:

SELECT time(str_to_date('20160125173013', '%Y%m%d%H%i%s'));
1
Blank 25 janv. 2017 à 08:30

Votre chaîne n'est pas au format, SQL Server effectuera un cast implicitement

DECLARE @YourDateTimeString VARCHAR(100)='20160125173013';

La requête suivante coupera les 8 premiers chiffres et les convertira en DATE, ce qui fonctionne implicitement (format non séparé). L'heure est coupée du côté droit, puis les deux : - signes sont placés aux bons endroits:

SELECT CAST(LEFT(@YourDateTimeString,8) AS DATE)
      ,CAST(STUFF(STUFF(RIGHT(@YourDateTimeString,6),5,0,':'),3,0,':') AS TIME);

Le résultat

2016-01-25  17:30:13.0000000

Si vous en avez besoin sous forme de chaîne sans le .0000000 de fin ( qui est une question de format de sortie pur et qui doit être fait dans votre couche de présentation! ), vous pouvez simplement utiliser LEFT(). L'entrée de cette fonction est une chaîne (à nouveau implicitement castée), la sortie est un texte qui ressemble à une heure .

SELECT CAST(LEFT(@YourDateTimeString,8) AS DATE)
      ,LEFT(CAST(STUFF(STUFF(RIGHT(@YourDateTimeString,6),5,0,':'),3,0,':') AS TIME),8);

Le résultat

2016-01-25  17:30:13
0
Shnugo 25 janv. 2017 à 08:53

Ne confondez pas STOCKAGE et PRESENTATION

Declare @YourTable table (DateTime varchar(25),Time time)
Insert Into @YourTable values
('20160125173013',null)

Update @YourTable
   Set Time = stuff(left(right(DateTime,6),4),3,0,':')

Select * 
      ,FormatedTime = Format(cast(Time as datetime),'HH:mm')
 From @YourTable

Retour

DateTime        Time                FormatedTime
20160125173013  17:30:00.0000000    17:30
0
John Cappelletti 25 janv. 2017 à 08:41

Avez-vous un champ DATETIME réel? Si tel est le cas, vous pouvez utiliser { {X1}}:

UPDATE mytable SET my_time=DATE_FORMAT(my_date, '%H:%i:%s')

Si vous n'avez pas de champ DATETIME natif, j'espère que vous pourrez le convertir en un, car les formats irréguliers et bizarres causent des problèmes et introduisent beaucoup de surcharge lors de l'analyse pour convertir. {{X1} } peut faire le contraire de DATE_FORMAT() et convertir des chaînes arbitraires en valeurs DATE ou DATETIME natives.

0
tadman 25 janv. 2017 à 08:30

Si vous utilisez un serveur SQL, utilisez la fonction Convertir

 Declare  @VarCharDate  varchar(max)
 Declare  @VarCharDate1 varchar(max)

--Déclarer

set  @VarCharDate = '20160125173013' --- YYYYMMDDHHMMSS

--Convertir

 set @VarCharDate1 =(select SUBSTRING(@VarCharDate,0,5) + '/' +
SUBSTRING(@VarCharDate,5,2)  + '/' + SUBSTRING(@VarCharDate,7,2)
  +  ' ' + SUBSTRING(@VarCharDate,9,2)
  +':'+SUBSTRING(@VarCharDate,11,2) +':' + RIGHT(@VarCharDate,2))

   select @VarCharDate1



 select  Convert(varchar(8),convert(datetime, @VarCharDate1, 120),114)
0
Yashveer Singh 25 janv. 2017 à 09:19

Sur la base de l'utilisation de la fonction STUFF, je crois que c'est Microsoft SQL Server, et non MySql. Pour cela, vous pouvez faire quelque chose comme ceci:

UPDATE db
SET [Time] = CAST(SUBSTRING([DATETIME], 9, 2) +':'+ 
                  SUBSTRING([DATETIME], 11, 2) +':'+ 
                  RIGHT([DATETIME], 2) As Time)
WHERE [Time] IS NULL
0
Zohar Peled 25 janv. 2017 à 08:48