CAST(0x00008F5800000000 AS DateTime) //2000-06-21 00:00:00 CAST(0x00008F5900000000 AS DateTime) //2000-06-22 00:00:00Это - внутренний формат даты в MSSQL. Вопрос - как из внутреннего формата преобразовать дату в нормальный вид?
Оказалось, проблема известна, и народ этот формат уже расковырял. Привожу функцию на C#, для конвертации внутреннего формата даты MSSQL в стандартный DateTime:
public static DateTime ConvertSqlBinaryToDate(String value) {
const String HEXADECIMAL_PREFIX = "0x";
if (value == null) {
throw new Exception("value is null");
}
if (value.Length != 18) {
throw new Exception("value should have length 18 bytes");
}
if (!value.StartsWith(HEXADECIMAL_PREFIX)) {
throw new Exception(String.Format("value should starts from {0}", HEXADECIMAL_PREFIX));
}
String first_part = value.Substring(2, 8);
String second_part = value.Substring(10, 8);
Double first_part_value = long.Parse(first_part, System.Globalization.NumberStyles.HexNumber);
Double second_part_value = long.Parse(second_part, System.Globalization.NumberStyles.HexNumber);
if (first_part_value > Int32.MaxValue) {
first_part_value = UInt32.MaxValue - first_part_value;
}
//Each unit of the value of the second 4 bytes matching a clock-tick
//Equivalent to 3.33 milliseconds.
const double MILLISECONDS_PRECISION = 3.33333333;
DateTime result = new DateTime(1900, 1, 1);
result = result.AddDays(first_part_value);
result = result.AddMilliseconds(second_part_value * MILLISECONDS_PRECISION);
return result;
}
Оригинал на VB по ссылке выше, в комментариях.
Комментариев нет:
Отправить комментарий