Sql server 将字符串转换为日期并获取Datepart

Sql server 将字符串转换为日期并获取Datepart,sql-server,tsql,datetime,type-conversion,string-parsing,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' 等等 提前感谢,, Ziad这是一种从陌生字符串中获取日期的方法 DECLARE @table TABLE (YourSt

我有一个字符串列,其日期时间值的格式为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'
等等

提前感谢,,
Ziad

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

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;
请注意,对日期时间的隐式转换将取决于您的系统设置。如果您的月份缩写不是系统期望的缩写,例如Dec在德国系统上是Dez,则此操作将失败

根据您的评论,我认为这是一次CSV导入操作。您可以指定SET语言为英语;进入第一行,以确保

对于实际日期,您可以继续使用相关函数,如DATEPART

暗示
始终使用适当的类型来存储数据!您应该使用它来修复数据,而不是用于任何混乱的输出…

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

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;
请注意,对日期时间的隐式转换将取决于您的系统设置。如果您的月份缩写不是系统期望的缩写,例如Dec在德国系统上是Dez,则此操作将失败

根据您的评论,我认为这是一次CSV导入操作。您可以指定SET语言为英语;进入第一行,以确保

对于实际日期,您可以继续使用相关函数,如DATEPART

暗示
始终使用适当的类型来存储数据!您应该使用它来修复数据,而不是用于任何浑浊的输出…

根据日期,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), ':', '')

根据日期的不同,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), ':', '')

以特定于文化的格式存储日期是一个非常糟糕的主意,使用特定于语言的格式更糟糕。。。您可以确定,这将始终在默认语言为英语的系统上运行吗?否则,您必须自己映射名称部分…问题的根源是我有一个包含日期时间值的字符串列。由于这是存储在错误的数据类型中,您现在意识到了为什么数据类型如此重要。我知道,但我在csv文件中获得了数据,它有这种愚蠢的格式,我需要修复它。如何以特定于文化的格式存储日期是一个非常糟糕的主意,使用特定于语言的格式更糟糕。。。您可以确定,这将始终在默认语言为英语的系统上运行吗?否则,您必须自己映射名称部分…问题的根源是我有一个包含日期时间值的字符串列。因为它存储在错误的数据类型中,您现在意识到了为什么数据类型如此重要。我知道,但我得到的数据是csv文件,它有这种愚蠢的格式,我需要修复它。我喜欢这种简单实用的方法+1,但是我看到了一些与等等相关的问题:-D…我喜欢这种简单实用的方法+1,但是我看到了一些与等等相关的问题:-D…这是一个很好的脚本。谢谢:这么好的剧本。谢谢: