【问题标题】:Dynamics NAV SQL Lead Time format conversionDynamics NAV SQL Lead Time 格式转换
【发布时间】:2016-08-09 15:35:13
【问题描述】:

我在从 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;

任何更好的解决方案将不胜感激!

【问题讨论】:

    标签: sql sql-server microsoft-dynamics microsoft-dynamics-nav


    【解决方案1】:

    我相信我找到了解决方案,但它似乎非常难看!

    在最后一个字符上额外使用 SQL ASCII 后,它返回数字 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;
    

    任何更好的解决方案将不胜感激!

    【讨论】:

      【解决方案2】:

      我知道这篇文章已经过时了,但我看到其他人在这方面寻求帮助。

      下面的代码仅适用于具有 D、W、M 或 Y 的格式,因为我不使用 C、WD 或 Q。编辑以匹配您的数据库名称。

      原始代码取自互联网上的其他地方。

      交期日期格式如下:

      1 = C - 当前(最后一个字符不能以此结尾,下面的代码不适用于具有此字符的字段)

      2 = D - 日

      3 = WD - 工作日

      4 = W - 周

      5 = M - 月

      6 = Q - 四分之一

      7 = Y - 年

      在您的选择中,执行以下操作:

      ,   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'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        相关资源
        最近更新 更多