Преобразование типов decimal и date / datetime в пользовательские эквиваленты varchar - PullRequest
1 голос
/ 28 октября 2010

Я создаю текстовый файл через пакет служб SSIS. Пакет считывает данные из таблицы, создает текстовый файл фиксированной длины и передает файл ftp партнеру.

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

Это моя проблема.

У меня есть два поля, давайте их назовем: DateOfHire - собирался хранить как дату или время, хотя время не имеет значения Доход - это всегда будет шкала 6 с точностью 2, то есть десятичная дробь (6,2)

Теперь мой вопрос таков, поскольку конечным пунктом назначения этих двух полей будет текстовый файл, и мне нужно изменить их формат перед записью, если я сохраню их так, как они должны быть хранится как, то есть дата как дата, а десятичное значение как десятичное или я должен просто сделать таблицу хранящей varchars?

Причина, по которой я спрашиваю, такова: Если дата найма 10/07/10 -> запись в файле будет записана как 100710 Если прибыль составляет $ 250,99 -> запись в файле будет записана как 025099

Это первый вопрос.

Второй вопрос заключается в том, как преобразовать десятичную дробь, например, 250,99, в 025099, учитывая, что 9999,99 - максимально возможный максимум.

Версия SQL Server: 2008

Ответы [ 2 ]

2 голосов
/ 28 октября 2010

Вопрос 1:

  • Хранить надлежащим образом (дата как дата и т. Д.).Другие клиенты могут использовать эти данные.И сделайте его удобочитаемым.

  • Преобразование на клиенте (для рендеринга в графическом интерфейсе или для экспорта файла) Для графического интерфейса вам могут потребоваться региональные настройки.Что касается файла, я бы подумал сделать это в SQL, хотя как часть bcp / read.

Вопрос 2:

Не преобразовывать в числовое значение, номанипулировать как строка, учитывая, как это просто.И вы избегаете проблем с типом даты

Для значения:

SELECT RIGHT('000000' + LTRIM(REPLACE(STR ('250.99', 7, 2), '.', '')), 6)

Или на основе вашего примера переключения

CASE
  WHEN Earnings = 250.99 THEN 
       --varchar, not decimal
       RIGHT('000000' + LTRIM(REPLACE(STR ('250.99', 7, 2), '.', '')), 6) 
  ELSE CONVERT(varchar(6), DateOfHire, 12) --varchar. not datetime
END AS Whatever
0 голосов
/ 28 октября 2010

Во-первых, я не рекомендую вам хранить эти значения в поле varchar.

При экспорте значений в текстовый файл вы можете использовать запрос для подготовки данных.

Например,

select convert(varchar(8), DateOfHire, 112) DateOfHireText,
,replicate('0', 6- len(convert(varchar(10), CEILING(earnings * 100)))) + convert(varchar(10), CEILING(earnings * 100)) EarningsText
from mytable

Возвращает данные в нужном формате.

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