Динамическое преобразование формата 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'