我需要以美国(mm-dd-yyyy)格式找到一个月的最后一天,该列格式为yymm(nvarchar格式)。
例子: - 1601 ---> 2016年1月31日
谢谢你的帮助!
答案 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);