获取月份SQL的最后日期

时间:2017-07-12 20:27:29

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

我需要以美国(mm-dd-yyyy)格式找到一个月的最后一天,该列格式为yymm(nvarchar格式)。

例子: - 1601 ---> 2016年1月31日

谢谢你的帮助!

4 个答案:

答案 0 :(得分:2)

使用转换来获取当月1日的日期,然后使用date来获取下个月的日期,再使用一个dateadd来获取前一天的日期:

DECLARE @D char(4) = '1601'

SELECT DATEADD(DAY, -1, DATEADD(MONTH, 1, CONVERT(date, @D + '01', 12)))

结果:

2016-01-31

答案 1 :(得分:1)

既然你说的是20XX年......

declare @oddDate nvarchar(4) = '1601'



select
    DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, '20' + cast(YY as varchar(2)) + cast(MM as varchar(2)) + '01') + 1, 0)) as LastDayof20Year
    ,'20' + cast(YY as varchar(2)) + cast(MM as varchar(2)) + '01' as MadeUpDate
from
(select 
    left(@oddDate,2) as YY
    ,right(@oddDate,2) as MM) x

或者只是......

select
    DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, '20' + cast(left(@oddDate,2) as varchar(2)) + cast(right(@oddDate,2) as varchar(2)) + '01') + 1, 0)) as LastDayof20Year

答案 2 :(得分:1)

使用1601字符串,我们只需附加一个01,因为这个世纪将被假设。这个新的160101字符串可以转换为日期。

示例

select convert(varchar(10),dateadd(day,-1,dateadd(month,1,YourCol+'01')),101)
 From  YourTable

返回

01/31/2016

答案 3 :(得分:1)

以下内容应该可以解决问题...

IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
DROP TABLE #TestData;

CREATE TABLE #TestData (
    CharDate CHAR(4) NOT NULL 
    );

INSERT #TestData (CharDate) VALUES 
    ('9801'), ('9902'), ('0012'), ('0202'), ('1005'), ('1503');

--============================================================

SELECT
    FormattedEOM = CONVERT(CHAR(10), em.EndOfMonth, 101)
FROM
    #TestData td
    CROSS APPLY ( VALUES (CASE WHEN CAST(LEFT(td.CharDate, 2) AS INT) > 30 THEN '19' ELSE '20' END) ) c (Century)
    CROSS APPLY ( VALUES (DATEFROMPARTS(CONCAT(c.Century, LEFT(td.CharDate, 2)), RIGHT(td.CharDate, 2), 1)) ) fm (FirstOfMonth)
    CROSS APPLY ( VALUES (EOMONTH(fm.FirstOfMonth)) ) em (EndOfMonth);

HTH, 杰森

编辑:以下内容适用于2008 ....

SELECT
    FormattedEOM = CONVERT(CHAR(10), em.EndOfMonth, 101)
FROM
    #TestData td
    CROSS APPLY ( VALUES (CASE WHEN CAST(LEFT(td.CharDate, 2) AS INT) > 30 THEN '19' ELSE '20' END) ) c (Century)
    CROSS APPLY ( VALUES (CAST(c.Century + td.CharDate + '01' AS DATE)) ) fm (FirstOfMonth)
    CROSS APPLY ( VALUES (DATEADD(mm, 1, fm.FirstOfMonth)) ) nm (NextMonth)
    CROSS APPLY ( VALUES (DATEADD(dd, -1, nm.NextMonth)) ) em (EndOfMonth);