Преобразование формата datatime SQL Server в unix time

#sql-server #datetime

#sql-сервер #datetime

Вопрос:

Мы работаем с JSON API, который возвращает время в том формате, который, как нам сказали, является форматом даты и времени SQL Server, например: /Date(-6847804800000 0000)

Я пытаюсь преобразовать это во время unix, чтобы использовать стандартные методы для этого, кто-нибудь знает простой способ сделать это? Если нет, было бы полезно преобразовать его в любой другой формат даты.

PS: У нас нет доступа к базе данных SQL Server, чтобы изменить способ, которым API выдает данные.

Комментарии:

1. -6847804800000 не поддерживает какой-либо известный формат datetime в SQL Server. Для начала, любое значение будет >0 для всех дат после 01 января 1900 года. Какую дату это должно представлять в любом случае?

2. Привет, gbn, я согласен. Я ни за что в жизни не смогу этого понять. Это должно соответствовать 1 января 1753 года в соответствии с имеющимся у нас XML-документом. Минус очень запутанный.

3. Если бы это были миллисекунды за 1970 год, вы бы получили 01 января 1753 года

4. минус означает, что это на много миллисекунд раньше 1970. Какой язык вы используете для преобразования даты?

Ответ №1:

Быстрая проверка с помощью PowerShell:

 PS> [datetime]"1970-01-01 00:00"   [timespan]::FromMilliseconds(-6847804800000)

01 January 1753 00:00:00
  

Итак, комментаторы Мартин и Гербен, похоже, правы. Это смещение на миллисекунду от 19700101T000000.

Комментарии:

1. Просто чтобы добавить немного контекста, 1753-01-01 — это минимальное значение, которое может принимать тип данных datetime. Это придает некоторую уверенность в том, что это правильный ответ.

2. @BenThul: Верно для datetime типа SQL, но не для . Значение NET DateTime (минимальное значение 0001-01-01), которому соответствует тип SQL (2008 и 2008R2) datetime2 . Нужно быть осторожным с datetime , поскольку это неоднозначно даже для продуктов MS.

Ответ №2:

Служба отключается SqlDateTime.MinValue часы дня, о которых она говорит.

Для определения значения смещения используется база 1753, вместо этого ваше смещение равно 1970.

Во-первых, вы хотите взять возвращенное значение -6847804800000 и добавить общее количество миллисекунд между 1753 и 1970 годами. Это даст вам смещение с 1970.

         SqlDateTime minSqlDateTime = SqlDateTime.MinValue;

        DateTime minTimeStampDateTime = new DateTime(1970, 1, 1);

        double milli = (minTimeStampDateTime - (DateTime)minSqlDateTime).TotalMilliseconds; // = 6847804800000

        double toDetermineTicks = -6847804080000; // so this is 01/01/1753 12:00 PM

        double ActualUnixTicks = (toDetermineTicks   milli) / 1000;