2010-06-23 4 views
3

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

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

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

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

Для клещи 634128921500016150 я надеюсь получить MySQL DateTime «2010-06-23 12:06:50»

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

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

Я попытался добавить больше нулей, но он никогда не совпадает: |

Я также попытался предложение Jon тарелочкам, но это дает почти тот же результат (некоторую долю секунды отличается)

ответ

5

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

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

EDIT : Я только что выяснил, почему эти годы так ошибаются. MySQL, minimum date является 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 минут. Возможно, что за последние годы он набирает обороты, или что-то в этом роде.

+0

Спасибо, но это дает тот же результат. Я обновил свой пост с более подробной информацией. – simendsjo

+0

@simendsjo: Я сделал редактирование - вы должны использовать 0001 вместо 0000. Я знаю, что звучит так, как будто это будет только 1 год разницы вместо 2000, но * возможно * 0 означает что-то особенное в mysql? –

+0

Большое спасибо, работает как шарм! base_ticks должен быть с 2001 года вместо 1001. «0000-00-00 00:00:00» - особое значение для пустой даты в mysql, как DateTime.MinValue – simendsjo

2

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

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); 
Смежные вопросы