Как преобразовать дату с миллисекундами в дату с тысячами вместо миллисекунд? - PullRequest
2 голосов
/ 01 мая 2019

Мои входящие данные содержат дату в следующем формате:

2019-05-01 15: 20: 51.920

но после загрузки в целевую систему он преобразуется в следующее:

2019-05-01 15: 20: 51.000

Я хотел бы преобразовать исходные данные и сравнить их с моей целевой системой, поскольку мои целевые данные соответствуют требованиям.

т.е. 2019-05-01 15:20:51.920 следует преобразовать в 2019-05-01 15:20:51.000

Я смотрю на функции преобразования следующим образом, но это только усечение мс (используя getdate (0 в качестве примера):

select CONVERT(DATETIME2(3),getdate())
--2019-05-01 15:20:51.920
select CONVERT(DATETIME2(2),getdate())
--2019-05-01 15:20:51.92

Может кто-нибудь сказать мне, как я мог этого достичь? Спасибо!

Ответы [ 5 ]

0 голосов
/ 02 мая 2019

Может быть, это должно дать результат, что вы ищете,

DECLARE  @TodayDatatime datetime
SET @TodayDatatime = DateAdd(DAY, DateDiff(DAY, 0, GetDate()), 0)
select GETDATE()
SELECT DateAdd(SECOND, DateDiff(SECOND, @TodayDatatime, GetDate()), @TodayDatatime)
0 голосов
/ 01 мая 2019

Очевидно, что обе даты равны datetime, и вы хотите обнулить миллисекундную часть. Это одно из решений:

SELECT srcdate, DATEADD(ms, -DATEPART(ms, srcdate), srcdate) AS newdate
FROM (VALUES
    (CAST('2019-05-01 15:20:51.920' AS datetime))
) x(srcdate)
0 голосов
/ 01 мая 2019

Почему бы просто не отбросить часть доли секунды, используя datetime2(0)?

declare @dateValue datetime2(3) = SysDateTime();

select Convert(datetime2(3), Convert(datetime2(0), @dateValue));
0 голосов
/ 01 мая 2019

Это также должен быть более или менее производительный способ:

SELECT GETDATE() AS OriginalValue
, CONVERT(DATETIME, CONVERT(VARCHAR(19), GETDATE(), 121)) ValueWithoutMilliseconds

Идея состоит в том, чтобы обрезать миллисекунды, обрезая последние 4 символа фиксированного формата вывода и затем преобразовывать его обратно в datetime

Выход:

OriginalValue           |   ValueWithoutMilliseconds
----------------------------------------------------
2019-05-01 21:44:58.473 |   2019-05-01 21:44:58.000
0 голосов
/ 01 мая 2019

Использование метода DATEADD / DATEDIFF для усечения дат может работать для этого.Другим вариантом является преобразование в datetime2 (0).

SELECT DATEADD( SS, DATEDIFF(SS, '2020', aDate), '2020'),
        CAST( aDate AS datetime2(0))
FROM  (VALUES( CAST( '2019-05-01 15:20:51.920' AS datetime2(3))))x(aDate)

Обратите внимание , что первый параметр будет усечен, а второй округлит значение.

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