在SQL中将字符串yyyymmddhhmmss转换为hh:mm:ss格式

时间:2017-01-25 08:24:10

标签: mysql sql datetime

使用字符串DATETIME yyyymmddhhmmss,例如20160125173013,我想将此字符串转换为hh:mm:ss (17:30:13)作为名为"时间"的新列。在带有sql update语句的表中。但是我只能使用stuff函数将其转换为17:30。 是否有任何可能的转换解决方案?

在我的陈述中

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

实际输出= 17:13:00.0000000

但我的预期输出为17:13:00

非常感谢!

6 个答案:

答案 0 :(得分:1)

这是mysql的奇迹:

SELECT time(str_to_date('20160125173013', '%Y%m%d%H%i%s'));

答案 1 :(得分:0)

如果您使用SQL服务器,请使用转换功能

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

- 声明

set  @VarCharDate = '20160125173013' --- YYYYMMDDHHMMSS

- 转换

 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)

答案 2 :(得分:0)

您是否有实际的DATETIME字段?如果是这样,您可以使用DATE_FORMAT()

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

如果您没有本地DATETIME字段,我希望您可以将其转换为一个字段,因为不规则,古怪的格式会导致问题并在解析转换时引入大量开销。 STR_TO_DATE()可以与DATE_FORMAT()相反,并从任意字符串转换为原生DATEDATETIME值。

答案 3 :(得分:0)

不要将STORAGE与演示混淆

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

返回

DateTime        Time                FormatedTime
20160125173013  17:30:00.0000000    17:30

答案 4 :(得分:0)

基于STUFF函数的使用,我相信这是Microsoft SQL Server,而不是MySql。 因此,你可以这样做:

UPDATE db
SET [Time] = CAST(SUBSTRING([DATETIME], 9, 2) +':'+ 
                  SUBSTRING([DATETIME], 11, 2) +':'+ 
                  RIGHT([DATETIME], 2) As Time)
WHERE [Time] IS NULL

答案 5 :(得分:0)

您的字符串不是格式,SQL Server将隐式转换

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

以下查询将剪切前8个数字并将其转换为DATE,隐式工作(未分离的格式)。时间从右侧切断,然后两个: - 标志被塞进正确的位置:

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

结果

2016-01-25  17:30:13.0000000

如果你需要这个字符串而没有尾随.0000000这是一个纯输出格式问题,应该在你的表示层中完成!)你可以使用{{1} }。此函数的输入是字符串(再次隐式转换),输出 看起来像的文本

LEFT()

结果

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