代码之家  ›  专栏  ›  技术社区  ›  SmallChess

SQL,将类似“12M”的字符串解析为12*30作为int

  •  1
  • SmallChess  · 技术社区  · 14 年前

    在SQL Server 2008中的一个存储过程中,我需要解析像“12M”这样的字符串,并返回12*30天的整数。因此,我基本上是解析和计算字符串所代表的天数。

    我想在字符串中的每个字符上做一个while循环。有什么建议吗?

    编辑(不是作者): 它的目标似乎是将“xM”转换为“x月日”(30天/月),“y y”转换为“y年日”(365天/年),“zD”转换为“z天”(无转换)。

    2 回复  |  直到 14 年前
        1
  •  3
  •   OMG Ponies    14 年前

    使用:

    DECLARE val INT
    
    SET val = CASE UPPER(RIGHT(column, 1))
                WHEN 'Y' THEN
                  CAST(SUBSTRING(column, 1, LEN(column)-1) AS INT) * 365
                WHEN 'M' THEN
                  CAST(SUBSTRING(column, 1, LEN(column)-1) AS INT) * 30
                WHEN 'D' THEN
                  CAST(SUBSTRING(column, 1, LEN(column)-1) AS INT) * 1
              END
    

    用于测试:

    WITH sample AS (
      SELECT '12M' AS [column]
      UNION ALL
      SELECT '100M'
      UNION ALL
      SELECT '10000M'  
      UNION ALL
      SELECT '1D'
      UNION ALL
      SELECT '34D'
      UNION ALL
      SELECT '2343M' )
    SELECT s.[column],
           CASE UPPER(RIGHT(s.[column], 1))
             WHEN 'Y' THEN
               CAST(SUBSTRING(s.[column], 1, LEN(s.[column])-1) AS INT) * 365
             WHEN 'M' THEN
               CAST(SUBSTRING(s.[column], 1, LEN(s.[column])-1) AS INT) * 30
             WHEN 'D' THEN
               CAST(SUBSTRING(s.[column], 1, LEN(s.[column])-1) AS INT) * 1
           END
      FROM sample s
    

    col      result
    -----------------
    12M      360
    100M     3000
    10000M   300000
    1D       1
    34D      34
    2343M    70290
    

    附录

    这些值应分别存储为两列:

    • 数值类型字符(1)(D、M、Y)
        2
  •  1
  •   TomTom    14 年前

    是的,不要用SQL。把它放在一个基于.NET的存储过程中——你会喜欢能够很容易地正确调试它,测试它,并且能够访问日期操作类。