Конвертировать DateTime.Ticks в MySQL DateTime в запросе - PullRequest
3 голосов
/ 23 июня 2010

У меня есть целочисленный столбец в MySql, в котором хранятся DateTime.Ticks.

Один тик представляет сто наносекунд или одну десятую миллионную секунды.В миллисекунде есть 10 000 тиков.

Значение этого свойства представляет количество интервалов в 100 наносекунд, прошедших с 12:00:00, полночь 1 января, 0001

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

Для галочек 634128921500016150 Я надеюсь получить mysql datetime '2010-06-23 12: 06: 50'

Iпредположил бы, что следующее должно сработать, но оно дает «4009-06-22 12: 15: 50.001600».Кажется, он выключен к 2001 году, 1 дню и 9 минутам ... Если годы и дни совпадают, я могу просто исправить это вручную, но минуты кажутся немного странными.

SELECT DATE_ADD('0000-01-01 00:00:00',
  INTERVAL 634128921500016150/10000000 SECOND_MICROSECOND);

I 'мы пытались добавить больше нулей, но они никогда не совпадают: |

Я также попробовал предложение Джона Скита, но оно дает почти тот же результат (некоторые доли секунды отличаются)

Ответы [ 3 ]

5 голосов
/ 23 июня 2010

Вместо добавления с использованием SECOND_MICROSECOND, попробуйте просто добавить с помощью MICROSECOND:

SELECT DATE_ADD('0001-01-01 00:00:00',
  INTERVAL 634121049314500000/10 MICROSECOND);

РЕДАКТИРОВАТЬ: я только что выяснил, почему годы так неправильно. минимальная дата MySQL - это год 1000. Поэтому я предлагаю вам изменить его на:

SELECT DATE_ADD('0001-01-01 00:00:00',
  INTERVAL (634121049314500000 - base_ticks)/10 MICROSECOND);

, где base_ticks - это значение тиков от new DateTime(1001, 1, 1).Ticks.

Черт, вы можете сделать ребаз в любом месте (например, 2000) - это может даже сработать в течение 9 минут.Вполне возможно, что он компенсирует дополнительные секунды или что-то в этом роде.

2 голосов
/ 19 марта 2012

Я обнаружил, что делаю то же самое сегодня.Между ответом Джона и комментариями я смог выяснить это, но здесь это как функция, все обернуто приятным бантом на нем:

CREATE FUNCTION TicksToDateTime(ticks BIGINT) RETURNS datetime DETERMINISTIC
RETURN CAST(DATE_ADD('2001-01-01 00:00:00', 
   INTERVAL (ticks - 631139040000000000)/10 MICROSECOND) AS DATETIME);
0 голосов
/ 11 мая 2018

А для тех из нас, кто занимается написанием кода на SQL Server Compact Edition, вышеупомянутая функция обернутого банта записывается в запросе как:

Выберите DATEADD (секунда, (CAST (([TickField] -631139040000000000) AS) FLOAT) / 10000000), '2001-01-01 00:00:00') из [таблицы]

Предыдущий код не работает в Compact Edition. Потребовалось время, чтобы понять, поэтому я подумал, что стоит включить.

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

Приветствие.

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