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

时间:2010-10-19 02:57:55

标签: sql sql-server tsql sql-server-2008

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

我不确定如何做到这一点。

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

编辑(非作者):目标是将“xM”转换为“x天数”(30天/月),“yY”转换为“y年数天” (365天/年),“zD”到“z天”(无转换)。

2 个答案:

答案 0 :(得分:3)

使用:

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

附录

这些值应分开存储,分为两列:

  • value INT
  • value_type CHAR(1)(D,M,Y)

答案 1 :(得分:1)

是的,不要在SQL中执行此操作。为这些东西放入一个基于.NET的存储过程 - 你会喜欢能够轻松地正确调试它,测试它并访问日期的manupulation类。