Преобразовать столбец типа Float в Date в sql -сервер - PullRequest
0 голосов
/ 06 февраля 2020

Мои даты хранятся в столбце с плавающей точкой, я безуспешно пытался изменить его на метку времени, теперь я хочу вычислить возраст из этого поля, я пробовал все виды комбинаций, используя функции CONVERT и CAST, но, похоже, не работает.

DoB
-434419200000
606960000000
1332806400000
1395878400000
-87350400000
890956800000

Я пытался:

 SELECT DATEADD(ss, dob, '19700101')
   from tbl

   //Result
   Error overflow .. arithmetique for type int, value= -434419200000.000000

    SELECT DATEADD(ss, CONVERT(bigint, dob, 101), '19700101')
    from tbl

    //Result
     Error while conversion from expression to type int.

ОБНОВЛЕНИЕ

ПРИМЕЧАНИЕ , что данные приведены в миллисекундах с даты «1970/1/1 00:00:00»

Спасибо.

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Как я упоминаю в комментариях, это комбинированный дубликат вопросов , конвертирующий метку времени эпохи в sql сервер (читаемый человеком формат) и Как рассчитать возраст (в годах) на основе на дату рождения и getDate () .

Пример данных:

CREATE TABLE dbo.YourTable (DoB float);
INSERT INTO dbo.YourTable (DoB)
VALUES (-434419200000),
       (606960000000),
       (1332806400000),
       (1395878400000),
       (-87350400000),
       (890956800000);

Затем, используя первую ссылку, мы получаем:

SELECT DATEADD(SECOND, DoB / 1000,'19700101') --As yours is milliseconds, not seconds.
FROM dbo.YourTable;

Тогда мы можем используйте ответ по второй ссылке:

SELECT YT.DoB,
       V.DateOfBirth,
       CONVERT(int,DATEDIFF(yy, V.DateOfBirth, GETDATE()) + 
       CASE WHEN GETDATE() >= DATEFROMPARTS(DATEPART(yyyy, GETDATE()), DATEPART(m, V.DateOfBirth), DATEPART(d, V.DateOfBirth)) THEN (1.0 * DATEDIFF(DAY, DATEFROMPARTS(DATEPART(yyyy, GETDATE()), DATEPART(m, V.DateOfBirth), DATEPART(d, V.DateOfBirth)), GETDATE()) / DATEDIFF(DAY, DATEFROMPARTS(DATEPART(yyyy, GETDATE()), 1, 1), DATEFROMPARTS(DATEPART(yyyy, GETDATE()) + 1, 1, 1)))
            ELSE -1 * (-1.0 * DATEDIFF(DAY, DATEFROMPARTS(DATEPART(yyyy, GETDATE()), DATEPART(m, V.DateOfBirth), DATEPART(d, V.DateOfBirth)), GETDATE()) / DATEDIFF(DAY, DATEFROMPARTS(DATEPART(yyyy, GETDATE()), 1, 1), DATEFROMPARTS(DATEPART(yyyy, GETDATE()) + 1, 1, 1)))
       END) AS Age
FROM dbo.YourTable YT
     CROSS APPLY (VALUES (DATEADD(SECOND, YT.DoB / 1000, '19700101'))) V (DateOfBirth);

Если этот ответ поможет, я предлагаю отказаться от ответов, на которые я ссылаюсь выше, так как это комбинация этих ответов.

1 голос
/ 06 февраля 2020

Правильный тип данных будет bigint вместо float. На самом деле, я бы лучше импортировал метки времени в столбце date.

Сказав это, разделите число на 1000, чтобы избежать ошибки переполнения:

select dateadd(second, -434419200000e0 / 1000, '1970-01-01')
-- 1956-03-27 00:00:00.000
...