Динамическое преобразование формата NAV SQL Lead Time

У меня небольшая проблема с получением данных, в частности с одним полем, из таблицы, реплицированной из Microsoft Dynamics NAV.

Есть поле, хранящее время выполнения заказа в странном формате, и как новичок я решил попросить у умнее совета за советом.

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

Пример данных

То, что я получил до сих пор, это символ, указывающий, что дни используются в строках 2 и 4, а один на недели - в строках 1 и 3.

Может кто-нибудь сказать, это какой-то "стандартный" способ хранения такого рода данных?

Подскажите, как перевести это в дни или указать мне правильное направление?

Я считаю, что нашел решение, но оно кажется очень уродливым!

РЕШЕНИЕ

SELECT
  [ItmCode] AS [ItemCode],
  [ItmDesc] AS [ItemDesc],
  [ItmLead] AS [LeadTime_Orginal],
  CASE WHEN ISNULL(ItmLead, '') ='' THEN 0 ELSE CHOOSE(ASCII(RIGHT(ItmLead, 1)), 0,1,0,7,0,0,0,0,0,0,0,0,0,0,0) * CAST(LEFT(ItmLead, LEN(ItmLead)-1) AS int) AS [LeadTimeInDays],
FROM dbo.nav_items;

Любое лучшее решение будет очень цениться!

2 ответа

Я считаю, что нашел решение, но оно кажется очень уродливым!

После использования SQL ASCII для extra на последнем символе он вернул числа 2 и 4, затем я использовал CHOOSE, чтобы присвоить этим значениям числа 1 и 7.

Наличие тех позволило мне умножить это на первую часть поля и достичь моей цели.

РЕШЕНИЕ

SELECT
  [ItmCode] AS [ItemCode],
  [ItmDesc] AS [ItemDesc],
  [ItmLead] AS [LeadTime_Orginal],
  CASE WHEN ISNULL(ItmLead, '') ='' 
  THEN 0 
  ELSE CHOOSE(ASCII(RIGHT(ItmLead, 1)), 0,1,0,7,0,0) * CAST(LEFT(ItmLead, LEN(ItmLead)-1) AS int) AS [LeadTimeInDays],
FROM dbo.nav_items;

Любое лучшее решение будет очень цениться!

Я знаю, что этот пост устарел, но я видел, как другие просили помощи в этом.

Приведенный ниже код будет работать только для форматов с D, W, M или Y, поскольку я не использую C, WD или Q. Отредактируйте, чтобы они соответствовали именам вашей базы данных.

Исходный код взят из другого места в Интернете.

Формат даты времени выполнения следующий:

1 = C - текущий (последний символ не может заканчиваться на этом, и приведенный ниже код не будет работать для полей с этим символом)

2 = Д - День

3 = WD - рабочий день

4 = Н - неделя

5 = М - Месяц

6 = Q - четверть

7 = Г - год

В вашем выборе выполните следующие действия:

      ,   Case
        When right([Vendor Lead Time],1) = char(2)  Then concat(left([Vendor Lead Time],len([Vendor Lead Time])-1),'D')
        When right([Vendor Lead Time],1) = char(3)  Then concat(left([Vendor Lead Time],len([Vendor Lead Time])-1),'WD')
        When right([Vendor Lead Time],1) = char(4)  Then concat(left([Vendor Lead Time],len([Vendor Lead Time])-1),'W')
        When right([Vendor Lead Time],1) = char(5)  Then concat(left([Vendor Lead Time],len([Vendor Lead Time])-1),'M')
        When right([Vendor Lead Time],1) = char(6)  Then concat(left([Vendor Lead Time],len([Vendor Lead Time])-1),'Q')
        When right([Vendor Lead Time],1) = char(7)  Then concat(left([Vendor Lead Time],len([Vendor Lead Time])-1),'Y')
                                            End             as 'Vendor Lead Time'
,   Case
        When [Vendor Lead Time] is null             Then 0
        When [Vendor Lead Time] like ''             Then 0
        When right([Vendor Lead Time],1) = char(2)  Then cast(left([Vendor Lead Time],len([Vendor Lead Time])-1)as int)
        When right([Vendor Lead Time],1) = char(4)  Then cast(left([Vendor Lead Time],len([Vendor Lead Time])-1)*7 as int)
        When right([Vendor Lead Time],1) = char(5)  Then cast(left([Vendor Lead Time],len([Vendor Lead Time])-1)*30 as int)
        When right([Vendor Lead Time],1) = char(7)  Then cast(left([Vendor Lead Time],len([Vendor Lead Time])-1)*365 as int)
                                            End             as  'Vendor Lead Time Days'
,   Case
        When right([Transport Time],1) = char(2)    Then concat(left([Transport Time],len([Transport Time])-1),'D')
        When right([Transport Time],1) = char(3)    Then concat(left([Transport Time],len([Transport Time])-1),'WD')
        When right([Transport Time],1) = char(4)    Then concat(left([Transport Time],len([Transport Time])-1),'W')
        When right([Transport Time],1) = char(5)    Then concat(left([Transport Time],len([Transport Time])-1),'M')
        When right([Transport Time],1) = char(6)    Then concat(left([Transport Time],len([Transport Time])-1),'Q')
        When right([Transport Time],1) = char(7)    Then concat(left([Transport Time],len([Transport Time])-1),'Y')
                                            End             as 'Vendor Transport Time'
,   Case
        When [Transport Time] is null               Then 0
        When [Transport Time] like ''               Then 0
        When right([Transport Time],1) = char(2)    Then cast(left([Transport Time],len([Transport Time])-1)as int)
        When right([Transport Time],1) = char(4)    Then cast(left([Transport Time],len([Transport Time])-1)*7 as int)
        When right([Transport Time],1) = char(5)    Then cast(left([Transport Time],len([Transport Time])-1)*30 as int)
        When right([Transport Time],1) = char(7)    Then cast(left([Transport Time],len([Transport Time])-1)*365 as int)
                                            End             as 'Vendor Transport Time Days'

Для общего времени выполнения выберите для:

      ([Vendor Lead Time Days]+[Vendor Transport Time Days])  as 'Total Vendor Lead Time'
Другие вопросы по тегам