如何在SQL中从Consumer<String>
中减去一个月?
例如从RuntimeException
到public static Consumer<String[]> validateLength3 =
(String[] input) -> { if(input.length != 3) throw new RuntimeException("length not equals 3");};
的示例。
答案 0 :(得分:2)
由于您不建议使用日期格式。但是对于您的情况,您可以使用以下查询来获得预期的结果。
使用DATEFROMPARTS()
和字符串函数可以将其构造为日期,而DATEADD(MONTH, -1, date)
将有助于减去一个月。
DECLARE @TestTable TABLE (DateVal VARCHAR(5));
INSERT INTO @TestTable (DateVal) VALUES ('02/23'), ('01/23'), ('03/30');
SELECT DateVal,
RIGHT(CONVERT(VARCHAR(8), DATEADD(MONTH, -1, DATEFROMPARTS(RIGHT(DateVal, 2), LEFT(DateVal, 2), '01')), 3), 5) AS Result
FROM @TestTable
结果:
DateVal Result
----------------------
02/23 01/23
01/23 12/22
03/30 02/30
答案 1 :(得分:2)
我认为您需要使用convert()
来获取有效日期,然后使用dateadd()
来减去1个月,最后使用format()
来获取字符串格式的日期:
select
format(dateadd(month, -1, convert(date, concat('01/', datecolumnname), 3)), 'MM/yy')
from tablename
请参见demo。
答案 2 :(得分:0)
这带有警告是非常丑陋的,但是如果您要在上个月输入字符串,然后再次输入字符串,则可以将dateadd转换为date,然后再返回字符串,更可怕!
with cte_d
as
(select '01/23' as stringdate
union
select '12/17' as stringdate
)
select stringdate
,cast(Month(dateadd(month,-1,cast(right(stringdate,2)
+ left(stringdate,2) + '01' as date))) as nvarchar(2))
+'/'+
right(cast(Year(dateadd(month,-1,cast(right(stringdate,2)
+ left(stringdate,2) + '01' as date))) as nvarchar(4)),2) as [NewDate]
from cte_d