Как мне создать дату и время из строки произвольного формата? - PullRequest
0 голосов
/ 06 июля 2011

У меня есть значения даты и времени, хранящиеся в поле в виде строк.Они хранятся в виде строк, потому что так они поступают по проводам, а необработанные значения используются в других местах.

Для создания отчетов я хочу преобразовать строку пользовательского формата (ггггммддччмм) в поле даты и времени в представлении,Мои отчеты будут использовать вид и работать с реальными значениями даты и времени.Это значительно упростит запросы по диапазонам дат.

Как мне выполнить это преобразование?Я создал представление, но не могу найти способ преобразовать строку в дату и время.

Спасибо!

Обновление 1 -

Вот SQL, который у меня есть до сих пор.Когда я пытаюсь выполнить, я получаю ошибку преобразования: «Преобразование не удалось при преобразовании даты и времени из символьной строки».

Как обрабатывать нули и строки даты и времени, в которых отсутствует часть времени (только ггггммдд)?

SELECT  
        dbo.PV1_B.PV1_F44_C1 AS ArrivalDT,

cast(substring(dbo.PV1_B.PV1_F44_C1, 1, 8)+' '+substring(dbo.PV1_B.PV1_F44_C1, 9, 2)+':'+substring(dbo.PV1_B.PV1_F44_C1, 11, 2) as datetime) AS ArrDT,

        dbo.MSH_A.MSH_F9_C2 AS MessageType,
        dbo.PID_A.PID_F3_C1 AS PRC,
        dbo.PID_A.PID_F5_C1 AS LastName, 
        dbo.PID_A.PID_F5_C2 AS FirstName,
        dbo.PID_A.PID_F5_C3 AS MiddleInitial,
        dbo.PV1_A.PV1_F2_C1 AS Score, 
        dbo.MSH_A.MessageID AS MessageId

FROM    dbo.MSH_A
        INNER JOIN dbo.PID_A ON dbo.MSH_A.MessageID = dbo.PID_A.MessageID
        INNER JOIN dbo.PV1_A ON dbo.MSH_A.MessageID = dbo.PV1_A.MessageID
        INNER JOIN dbo.PV1_B ON dbo.MSH_A.MessageID = dbo.PV1_B.MessageID

Ответы [ 7 ]

3 голосов
/ 06 июля 2011

Согласно здесь , нет никакого готового CONVERT для перехода из вашего формата yyyymmddhhmm к дате и времени.

Ваша стратегия будет разбирать строку в одном из форматов, указанных в документации, а затем преобразовывать ее.

2 голосов
/ 06 июля 2011
declare @S varchar(12)
set @S = '201107062114'

select cast(substring(@S, 1, 8)+' '+substring(@S, 9, 2)+':'+substring(@S, 11, 2) as datetime)

Результат:

2011-07-06 21:14:00.000'

Сначала ваша строка даты изменится на 20110706 21:14.Формат даты ггггммдд в виде строки безопасно преобразовать в дату и время в SQL Server независимо от значения SET DATEFORMAT .

Редактировать:

declare @T table(S varchar(12))

insert into @T values('201107062114')
insert into @T values('20110706')
insert into @T values(null)

select 
  case len(S)
    when 12 then cast(substring(S, 1, 8)+' '+substring(S, 9, 2)+':'+substring(S, 11, 2) as datetime)
    when 8 then cast(S as datetime)
  end   
from @T

Результат:

2011-07-06 21:14:00.000
2011-07-06 00:00:00.000
NULL
1 голос
/ 07 июля 2011

Один вкладыш:

declare @datestring varchar(255)
set @datestring = '201102281723'

select convert(datetime, stuff(stuff(@datestring,9,0,' '),12,0,':') , 112 )

Результат:

2011-02-28 17:23:00.000
1 голос
/ 06 июля 2011
DECLARE @d VARCHAR(12);

SET @d = '201101011235';

SELECT CONVERT(SMALLDATETIME, STUFF(STUFF(@d,9,0,' '),12,0,':'));

Обратите внимание, что, сохраняя данные даты / времени с использованием неподходящего типа данных, вы не сможете предотвратить попадание неверных данных сюда.Так что может быть безопаснее сделать это:

WITH x(d) AS
(
    SELECT d = '201101011235'
        UNION SELECT '201101011267' -- not valid
        UNION SELECT NULL -- NULL
        UNION SELECT '20110101' -- yyyymmdd only
),
y(d, dt) AS 
(
    SELECT d,
        dt = STUFF(STUFF(LEFT(d+'000000',12),9,0,' '),12,0,':')
    FROM x
)
SELECT CONVERT(SMALLDATETIME, dt), ''
    FROM y
    WHERE ISDATE(dt) = 1 OR d IS NULL
UNION
SELECT NULL, d
    FROM y
    WHERE ISDATE(dt) = 0 AND d IS NOT NULL;
1 голос
/ 06 июля 2011

Как правило, вы можете использовать этот код:

SELECT convert(datetime,'20110706',112)

Если вам нужно заставить SQL Server использовать строку произвольного формата, используйте следующий код:

SET DATEFORMAT ymd

SELECT convert(datetime,'20110706')
1 голос
/ 06 июля 2011

Можно использовать CAST или CONVERT.

Пример с сайта:

G.Использование CAST и CONVERT с данными даты и времени

В следующем примере отображается текущая дата и время, используется CAST для изменения текущей даты и времени на символьный тип данных, а затем используется CONVERT для отображения даты и времени в ISO8901 формат.

SELECT 
   GETDATE() AS UnconvertedDateTime,
   CAST(GETDATE() AS nvarchar(30)) AS UsingCast,
   CONVERT(nvarchar(30), GETDATE(), 126) AS UsingConvertTo_ISO8601;
GO

Вот набор результатов.

UnconvertedDateTime     UsingCast                      UsingConvertTo_ISO8601

----------------------- ------------------------------ ------------------------------

2006-04-18 09:58:04.570 Apr 18 2006 9:58AM             2006-04-18T09:58:04.570



(1 row(s) affected)
0 голосов
/ 06 июля 2011
DECLARE @test varchar(100) = '201104050800'
DECLARE @dt smalldatetime

SELECT @dt = SUBSTRING(@test, 5, 2) 
             + '/' + SUBSTRING(@test, 7, 2) + '/' 
             + SUBSTRING(@test, 1, 4) + ' ' + SUBSTRING(@test, 9, 2) 
             + ':' + SUBSTRING(@test, 11, 2)

SELECT @dt

Выход:

2011-04-05 08:00:00

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...