计算一个时期的月份的最后日期

时间:2015-09-23 10:24:00

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

我有 <!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> 012015022015等句号,

此处前两个字符为032015,最后四个字符为Month

我的结果应该是

Year2015013120150228这只是该月的最后日期。

你能用SQL帮我解决这个问题吗?

5 个答案:

答案 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)

SQL 2012 +

尝试 EOMONTH

select EOMONTH(yourdate_)

答案 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) 完成