Как преобразовать ггггммдд миллисекунды в дату и время в SQL Server? - PullRequest
1 голос
/ 18 февраля 2010

Я получил таблицу с некоторыми временными данными в формате ггггммдд миллисекунды. Например, 20100218000051234. Как преобразовать это в тип DateTime? В SQL Server 2008.

Ответы [ 6 ]

6 голосов
/ 18 февраля 2010

попробуйте это:

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 голосов
/ 18 февраля 2010

В приведенном выше примере неясно, представляет ли 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
1 голос
/ 18 февраля 2010

Вам нужно будет использовать комбинацию convert и substring. Есть довольно хороший пример, с которого вы можете экстраполировать на http://www.sqlusa.com/bestpractices/datetimeconversion/.

Вы также можете найти документацию по функциям работы со строками T-SQL здесь .

0 голосов
/ 19 февраля 2010

Интересно, что если вы используете 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
0 голосов
/ 18 февраля 2010

В качестве альтернативы (полезно, если у вас есть несколько других «разборов информации», вы можете обнаружить, что это пример того, где вы можете использовать функцию 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));
   }
};
0 голосов
/ 18 февраля 2010

Вам нужно будет использовать SUBSTRING и CAST .

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...