Мне нужно преобразовать эту строку в datetime в SQL Server - PullRequest
0 голосов
/ 04 января 2019

Строка:

'01/04/2019 01:50:31.230000000'

Ожидаемый результат:

01/04/2019 01:50:31.230

как DATETIME.

Используемый запрос:

SELECT CONVERT(DATETIME, '01/04/2019 01:50:31.230000000', 113)  

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Код, который вы хотите:

SELECT CONVERT(datetime,LEFT('01/04/2019 01:50:31.230000000',23),103);

Вам необходимо использовать LEFT, поскольку datetime имеет точность только до 1/300 секунды; таким образом, вам нужно обрезать точность, которая не может быть использована.

0 голосов
/ 04 января 2019

Преобразование этой строки в формате 103 сработало бы, если бы в ней не было 6 последних нулей.
Таким образом, SUBSTRING или LEFT может использоваться для хранения только 23 символов.
А затем преобразовать его в DATETIME.

Но эта строка может быть просто преобразована в DATETIME2.
Поскольку DATETIME2 является более точным.
И DATETIME2 может быть просто приведен или преобразован в DATETIME.

Обратите внимание, что DATETIME не сохраняется с форматом в таблице.
То, как это отображается, является настройкой.

Однако вы можете FORMAT DATETIME вернуться к строке в определенном формате , который вам нужен. (начиная с SQL Server 2012)

Пример фрагмента:

select 
col as col_input_string,
CAST(CONVERT(datetime2, col, 103) AS datetime) as col_as_datetime,
FORMAT(CONVERT(datetime2, col, 103), 'dd/MM/yyyy HH:mm:ss.fff') as col_as_formatted_string
from (values 
 ('01/04/2019 01:50:31.230000000')
,('31/12/2018 13:33:44.123456789')
) q(col);

Результат:

col_input_string                col_as_datetime             col_as_formatted_string
01/04/2019 01:50:31.230000000   2019-04-01 01:50:31.230     01/04/2019 01:50:31.230
31/12/2018 13:33:44.123456789   2018-12-31 13:33:44.123     31/12/2018 13:33:44.123
0 голосов
/ 04 января 2019

Попробуйте использовать

declare @vardate varchar(50) = '01/04/2019 01:50:31.230000000'
declare @date datetime =convert(date, left(@vardate,23), 103)
declare @time time = convert(time, substring(@vardate,12,12), 14)

select DATEADD(DAY, DATEDIFF(DAY, @time, @date), CAST(@time AS DATETIME)) AS Result

, если это не работает, проверьте различные форматы преобразования.

...