从一个周期计算每月的最后一天



我有一个像012015, 022015, 032015等的句号,

这里前2个字符是Month,后4个字符是Year

结果应该是

20150131, 20150228, 20150331,这只是该月的最后日期。

你能帮我这个在SQL吗?

你可以这样做:

示例数据

CREATE TABLE #dates
(
    Period NVARCHAR(40)
)
INSERT INTO #dates VALUES ('012015'),('022015'),('032015')
查询

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

希望能有所帮助,

CONVERT(NVARCHAR(8), DATEADD(DAY, -1,SUBSTRING('012015', 3, 5) + SUBSTRING('012015', 0, 3) + '01'), 112)

将硬编码日期更改为要解析的日期。

祝你好运!

SQL 2012+

<尝试strong> EOMONTH

select EOMONTH(yourdate_)

计算每个月的最后一天有点困难(从一个月到另一个月不等,考虑到闰年等)。

你可以计算下个月的第一个日期:

myDate = '01/02/2015'

,然后找出前一个月的最后一天减去1的日期:

myDate = DateAdd(date, -1, myDate)

结果将是:

'31/01/2015'

得到一个月的最后一天并不那么难:

select dateadd(day, -1, dateadd(month, 1, dateadd(day, -datepart(day, getdate()) + 1, getdate())))

的作用很简单:得到日部分,然后从日期中减去它,这样就得到月的第一天
现在添加一个月
现在减去一天

差点忘了,要按要求的格式显示日期,可以这样做:
SELECT CONVERT(VARCHAR(10), getdate(), 112)完成了

最新更新