在SQL Server 2008的存储过程中,我需要解析像“12M”这样的字符串,并返回12 * 30天作为int。所以,我基本上是在解析和计算字符串代表的天数。
我不确定如何做到这一点。
我想在字符串中的每个字符上做一个while循环。有什么建议吗?
编辑(非作者):目标是将“xM”转换为“x天数”(30天/月),“yY”转换为“y年数天” (365天/年),“zD”到“z天”(无转换)。
答案 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
这些值应分开存储,分为两列:
答案 1 :(得分:1)
是的,不要在SQL中执行此操作。为这些东西放入一个基于.NET的存储过程 - 你会喜欢能够轻松地正确调试它,测试它并访问日期的manupulation类。