2010-02-18 64 views

回答

0

有趣的是,如果你使用的是SQL Server 2005和之前的例子,你将无法获得前因为DateTime值被四舍五入至.000,.003或.007的增量,因此您需要执行精度。因此,51.234变为51.233。但是,如果使用DateTime2,则可以获得所需的精度:

declare @x varchar(50) 
set @x='20100218000051234' 
Select DateAdd(ms, Cast(Substring(@x, 9, 9) As int), Cast(Substring(@x, 1, 8) As datetime)) 
Select DateAdd(ms, Cast(Substring(@x, 9, 9) As int), Cast(Substring(@x, 1, 8) As datetime2)) 

Results: 
2010-02-18 00:00:51.233 
2010-02-18 00:00:51.2340000 
6

试试这个:

declare @x varchar(50) 
set @x='20100218000051234' 
select DATEADD(ms,CONVERT(int,RIGHT(@x,9)),CONVERT(datetime,LEFT(@x,8))) 

输出

----------------------- 
2010-02-18 00:00:51.233 

(1 row(s) affected) 
2

在你上面的例子,目前尚不清楚是否20100218000051234代表

Year: 2010 
Month: 02 (February 
Day: 18 
Milliseconds: 000051234 

或者:

Year: 2010 
Month: 02 (February 
Day: 18 
Hours: 00 
Minutes: 00 
Seconds: 51 
Milliseconds: 234 
+2

不是问题标题指定** yyyymmddMilliseconds **的格式? – 2010-02-18 19:51:18

+0

KM:你是对的 - 它似乎确定最后9个字符代表“毫秒”,但由于它似乎是一个不寻常的格式字符串,我认为最好仔细检查一下 – 2010-02-18 20:26:47

0

您将需要使用SUBSTRINGCAST

SELECT CAST(
     SUBSTRING(dateString, 1, 4) + '-' + 
     SUBSTRING(dateString, 5, 2) + '-' + 
     SUBSTRING(dateString, 7, 2) 
     AS date) 

你需要的价值观发挥和时间增加的信息,但成品应该是这样的:

SELECT CAST('1998-02-23 14:23:05' AS date) 
0

作为替代(有用的,如果你也有其他多个“信息分析”的事,你会发现,这是您可能希望使用SQLCLR功能

using System; 
using System.Data.SqlTypes; 
using System.Globalization; 

public partial class UserDefinedFunctions 
{ 
    [Microsoft.SqlServer.Server.SqlFunction] 
    public static SqlDateTime Parse(SqlString s) 
    { 
     if (s.IsNull) 
     return SqlDateTime.Null; 

     return new SqlDateTime(DateTime.ParseExact(s.Value,"yyyyMMddhhmmssfff",CultureInfo.InvariantCulture)); 
    } 
}; 
相关问题