将String转换为date并获取Datepart

时间:2018-01-29 15:52:13

标签: sql-server tsql datetime type-conversion string-parsing

我有一个字符串列,其日期时间值为此格式(2016年11月8日星期二06:14:57 GMT)。如何获取此值的日期部分?等。

SELECT DATEPART(MINUTE, 'Tue Nov 8 06:14:57 GMT 2016') as 'Minute'
SELECT DATEPART(Day, 'Tue Nov 8 06:14:57 GMT 2016') as 'Day'

等等。

提前致谢, 齐亚德

2 个答案:

答案 0 :(得分:4)

这是一种从奇怪的字符串中获取日期的方法

DECLARE @table TABLE (YourStrangeDate VARCHAR(100));
INSERT INTO @table VALUES('Tue Nov 8 06:14:57 GMT 2016');

WITH Splitted AS
(
    SELECT CAST('<x>' + REPLACE(YourStrangeDate,' ','</x><x>') + '</x>' AS XML) AS Casted
    FROM @table 
)
SELECT
CAST(
             Casted.value('/x[3]','nvarchar(2)') --third part = "8" 
     + ' ' + Casted.value('/x[2]','nvarchar(3)') --second part = "Nov"
     + ' ' + Casted.value('/x[6]','nvarchar(4)') --6th part = "2016"
     + ' ' + Casted.value('/x[4]','nvarchar(8)') --4th part = Time
     AS DATETIME)
FROM Splitted;

注意隐式CAST()DATETIME将依赖于您系统的设置。如果您的月份缩写不是您的系统预期的缩写(例如德语系统中的“Dec”是“Dez”),则会失败。

根据您的评论,这是一次性操作(CSV导入)。您可以在第一行指定SET LANGUAGE English;以确保...

使用实际日期,您可以继续使用相关功能,例如DATEPART()

提示

始终使用适当的类型来存储您的数据!您应该使用它来修复您的数据,而不是任何泥泞的输出......

答案 1 :(得分:1)

根据日期9和/或10符号将属于日期,并且在第一个:符号后的1或2个符号将是分钟。所以,你可以通过这个查询获得它们

    declare @x varchar(50) = 'Tue Nov 8 06:14:57 GMT 2016'
    select [Day] = cast(substring(@x, 9, 2) as int)
           , 'Minute' = replace(substring(@x, charindex(':', @x) + 1, 2), ':', '')