2016-11-29 9 views
0

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

У меня есть поле в таблице SQL, который сохраняется как DATETIME в следующем формате:

2016-11-26 00:00:00 

Это все хорошо-и-хорошо, за исключением того, что мне это нужно в формате dd/MM/yyyy.

Я не хочу использовать функцию CONVERT(VARCHAR(10), @dateField, 103) в SQL, потому что я хочу формат DATE, а не формат STRING.

Я экспортирую результат DataTable в Excel с помощью библиотеки EPPlus, и мне нужны поля даты в экспорте в этом точном формате.

Я пробовал:

  • FORMAT(@dateField, 'dd/MM/yyyy', 'en-gb'), а также литье это обратно к типу DATE. Он по-прежнему неявно преобразуется в VARCHAR или NVARCHAR.
  • Листинг @dateField для DATE и SMALLDATETIME
  • Использование C# для его преобразования в дату в правильном формате. DateTime.ParseExact(dataTable.Rows[i]["DateField"].ToString(), "dd/MM/yyyy", CultureInfo.InvariantCulture);
  • EPPlus форматирование колонки: workSheet.Column(19).Style.Numberformat.Format = "dd/MM/yyyy";

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

+0

Почему вы называете 'DateTime.ParseExact'? Значение уже должно быть 'DateTime', поэтому просто добавьте его к этому и * затем * вызовите' ToString'. И если вам нужен конкретный формат, вы * * запрашиваете строку, а не значение DateTime. –

+1

DateTime имеет ** NO ** формат. Это двоичное значение, так же как DateTime .NET или bool или десятичное. Вам ничего не нужно конвертировать. Просто используйте параметризованный запрос или ORM и передайте значения DateTime в качестве параметров DateTime. EPPlus также не нуждается в каких-либо конкретных форматах: даты в Excel используют двоичный формат OADate, а EPPlus напрямую преобразует DateTime в него. Как Excel отображает дату, зависит от конкретного стиля столбца, который * может * ввести в заблуждение –

+0

@JonSkeet Я попробовал регулярный анализ и прямой трансляции. Параметр не изменил формат, и прямой бросок бросил InvalidCastException. Изменение типа в SQL, даже без преобразования, сохраняет значение в электронной таблице как число. Я ожидаю 22/03/2011, но значение ячейки составляет 40624 :( – GrammatonCleric

ответ

0

Если это столбец datetime, он сохраняется как двоичное представление даты; это только когда визуализируется в клиентском приложении, например, в студии управления, в каком-то формате.

Так что если вам это нужно в определенном формате, вы подразумеваете визуализацию в виде строки в этом формате. Вы всегда можете преобразовать обратно в datetime (и должны!) При сохранении обратно в базу данных. Например, вы можете отрезать временную часть от даты и времени до сохранения.

+0

Справедливое заключение, однако, это сторонняя система, и у меня нет прав на изменение кода таким образом, что я могу отправить данные в базу данных определенным образом. – GrammatonCleric

+0

Извините, если я ошибаюсь, но Sql Сервер будет хранить данные в datetime как число, представляющее дату, формат является очень важным при анализе/отображении данных и, конечно же, при вставке/обновлении. Всегда лучше использовать формат, который недвусмыслен для Sql Server (скажем, 29 ноября 2016 г.), но если ваша сторонняя система работает с форматом, который вы ему даете, вы должны быть в порядке? –

+0

@GrammatonCleric, скорее всего, вы путаете способ отображения в Excel даты для проблемы форматирования SQL. Здесь ничего нет. Даты в Excel всегда * сохраняются как десятичные числа (смещение по дате + временная доля). Это отображается по-разному в зависимости от выбранного формата номера. Некоторые из них считаются «локальными» форматами, что приводит к различным форматам для разных локалей –

Смежные вопросы