我有 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="controller" extends="struts-default">
<action name="loginaction" class="controller.LoginAction">
<result name="input">/Login.jsp</result>
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
,012015
,022015
等句号,
此处前两个字符为032015
,最后四个字符为Month
。
我的结果应该是
Year
,20150131
,20150228
这只是该月的最后日期。
你能用SQL帮我解决这个问题吗?
答案 0 :(得分:4)
你可以在下面这样做:
示例数据
CREATE TABLE #dates
(
Period NVARCHAR(40)
)
INSERT INTO #dates VALUES ('012015'),('022015'),('032015')
<强> QUERY 强>
SELECT DATEADD(MONTH,1+DATEDIFF(MONTH,0,CAST((CAST(RIGHT(Period,4) AS INT) * 100 + CAST(LEFT(Period,2) AS INT)) * 100 + 01 AS NVARCHAR(20))),-1)
FROM #dates
<强>输出强>
Input Output
012015 2015-01-31 00:00:00.000
022015 2015-02-28 00:00:00.000
032015 2015-03-31 00:00:00.000
<强>更新强>
或者您可以使用REPLACE
按预期获得输出:
SELECT REPLACE(CAST(DATEADD(MONTH,1+DATEDIFF(MONTH,0,CAST((CAST(RIGHT(Period,4) AS INT) * 100 + CAST(LEFT(Period,2) AS INT)) * 100 + 01 AS NVARCHAR(20))),-1) AS DATE),'-','')
更新后输出
Input Output
012015 20150131
022015 20150228
032015 20150331
更新2
提供的数据按预期工作。
CREATE TABLE #dates
(
Period NVARCHAR(40)
)
INSERT INTO #dates VALUES ('022019'),('022019'),('022019'),('022019'),('112018'),('082019'),('082019'),('082019'),('082019'),('112018'),('112018'),('112018'),('082019'),('022019'),('022019'),('022019'),('022019'),('052016'),('052016'), ('122016')
SELECT Period as Input,
REPLACE(CAST(DATEADD(MONTH,1+DATEDIFF(MONTH,0,CAST((CAST(RIGHT(Period,4) AS INT) * 100 + CAST(LEFT(Period,2) AS INT)) * 100 + 01 AS NVARCHAR(20))),-1) AS DATE),'-','') as [Output]
FROM #dates
<强>输出强>
Input Output
022019 20190228
022019 20190228
022019 20190228
022019 20190228
112018 20181130
082019 20190831
082019 20190831
082019 20190831
082019 20190831
112018 20181130
112018 20181130
112018 20181130
082019 20190831
022019 20190228
022019 20190228
022019 20190228
022019 20190228
052016 20160531
052016 20160531
122016 20161231
答案 1 :(得分:0)
希望它有所帮助,
CONVERT(NVARCHAR(8), DATEADD(DAY, -1,SUBSTRING('012015', 3, 5) + SUBSTRING('012015', 0, 3) + '01'), 112)
将硬编码日期更改为您要解析的日期。
祝你好运!答案 2 :(得分:0)
答案 3 :(得分:0)
计算每个月的最后一天有点困难(从一个月到另一个月,考虑到闰年等)。
您可以计算下个月的第一个日期:
myDate = '01/02/2015'
然后找到前一个月的最后一天减去1到该日期:
myDate = DateAdd(date, -1, myDate)
结果将是:
'31/01/2015'
答案 4 :(得分:0)
获得本月的最后一天并不是那么难:
select dateadd(day, -1, dateadd(month, 1, dateadd(day, -datepart(day, getdate()) + 1, getdate())))
做什么很简单:
获取日期部分,并从日期中减去它,以便您在该月的第一天到达
现在加一个月
现在减去一天
差点忘了,要按照要求的格式显示日期,你可以这样做:
SELECT CONVERT(VARCHAR(10),getdate(),112)
完成