我有一个int列,存储日期如下:
201101
201102
201103
我需要接受这些int并将它们转换成这样的东西:
01/2011
02/2011
03/2011
但是在同一列中,我需要在该日期添加一年,因此我希望以下列与现有
相对应201101 = 01/2011 - 12/2011
201102 = 02/2011 - 01/2012
201103 = 03/2011 - 02/2012
到目前为止我做了以下操作,使其成为日期字符串:
RIGHT(RTRIM([x].[Work_Month]),2) + '/' + LEFT([x].[Work_Month],4) AS PeriodDisplay
我只是不知道如何添加一年呢?
由于
答案 0 :(得分:1)
DATEADD(yyyy,1,convert(date,RIGHT(RTRIM([x].[Work_Month]),2) + '/01/' + LEFT([x].[Work_Month],4) ))
我所做的改变:
convert(date)
函数中,将其转换为日期类型。 msdn dateadd
函数中将其包围,以添加一年。 msdn 如果您确实希望该列包含两个日期(因此该字符串将在字面上为03/2011 - 02/2012),那么只需从第一个日期中删除dateadd。如果你不想要这些日子,那么你可以使用子字符串去除它们。这确实是一个前端的事情:SQL Server不是这样做的理想工具。
答案 1 :(得分:1)
我的建议是将它们变成日期,对逻辑进行排序,将它们转换为字符串。
与尝试将其全部用作字符串相反。
SELECT
DATEADD(
MONTH,
(work_month % 100) - 1),
DATEADD(
YEAR,
(work_month / 100) - 2001,
'2000-Jan-01'
)
) AS "Start",
DATEADD(
MONTH,
(work_month % 100) - 1),
DATEADD(
YEAR,
(work_month / 100) - 2000,
'2000-Jan-01'
)
) - 1 AS "End",
FROM
myTable
(使用字符串混乱比弄乱日期和整数要慢得多。所以这段代码可能看起来要长一些,但是在任何大量的记录中你都可能看到明显的性能差异。)
答案 2 :(得分:1)
以与开始月份相同的格式准备结束月份,然后将您已经获得的转化应用于两者:
SELECT
RIGHT(RTRIM(x.WorkMonth1),2) + '/' + LEFT(x.WorkMonth1,4) + ' - ' +
RIGHT(RTRIM(x.WorkMonth2),2) + '/' + LEFT(x.WorkMonth2,4) AS PeriodDisplay
FROM (
SELECT
WorkMonth1 = Work_Month,
WorkMonth2 = Work_Month + CASE Work_Month % 100 WHEN 1 THEN 11 ELSE 99 END
FROM atable
) x
答案 3 :(得分:1)
declare @T table (wm int)
insert into @T values
(201101),
(201102),
(201103)
select
right(convert(char(10),dateadd(m,wm%100-1 ,dateadd(yy,wm/100-year(0),0)),103),7) as StartDate,
right(convert(char(10),dateadd(m,wm%100+10,dateadd(yy,wm/100-year(0),0)),103),7) as EndDate
from @T
结果
StartDate EndDate
--------- -------
01/2011 12/2011
02/2011 01/2012
03/2011 02/2012
答案 4 :(得分:0)
Declare @SampleData Table ( Value int not null )
Insert @SampleData(Value) Values(201101)
Insert @SampleData(Value) Values(201102)
Insert @SampleData(Value) Values(201103)
Select Cast( Cast(Value As char(6)) + '01' As datetime)
, DateAdd(mm,11,Cast( Cast(Value As char(6)) + '01' As datetime))
From @SampleData
将值转换为日期后,您可以使用表示层将日期格式设置为MM/yyyy
。