在SQL中将月份和年份组合转换为日期

时间:2014-03-03 04:12:46

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

我在单独的列中有月份和年份,我想记录两点之间的记录(即开始日期和结束日期)。我一个月都有。我发现的一个解决方案是将日期,月份组合转换为日期。我有

Start month : 3 Start year : 2010
End month : 6 End year : 2013

我想将它们转换为

 start date = 01-03-2010 

 End date = 31-06-2013

任何解决方案?

6 个答案:

答案 0 :(得分:3)

以下是通过传递月份和年份来查找上个月和第一个日期的方法

DECLARE @month varchar(2)
DECLARE @year varchar(4)

月份的第一个日期

set @month='03'
set @year='2010'
select cast(@year + '-' + @month + '-01' as date)

输出

2010-03-01

上个月的某个日期(将您的月份增加1,然后减去1天)

set @month='06'
set @year='2013'
select CAST(cast(@year + '-' + Cast(cast(@month as int )+1 as varchar(20)) + '-01' as datetime)-1 as DATE)

输出

2013-06-30

答案 1 :(得分:1)

这是一种方法:

select convert(date, cast(startyear*10000 + startmon*100 + 1 as varchar(8)), 112)
. . .

答案 2 :(得分:1)

正如 Marc B 所说,结束月份会很难,因为你需要弄清楚指定年/月的最后一天是什么。

试试这个

DECLARE @StartMonth INT = 3 
DECLARE @StartYear INT = 2010 
DECLARE @EndYear INT = 2013 
DECLARE @EndMonth INT = 6 

SELECT Dateadd(year, @StartYear - 2000,Dateadd(month, @StartMonth - 1, '20000101')) AS StartDate, 
       Dateadd(year, @EndYear - 2000, Dateadd(month, @EndMonth - 1, '20000101')) AS EndDate

答案 3 :(得分:0)

如果将dateparts存储为int,你可以做一些简单的事情,比如将它们转换为varchar,连接并再次强制转换。例如:

DECLARE @StartYear INT = 2012
DECLARE @StartMOnth INT = 6

SELECT CAST(CAST(@StartYear AS CHAR(4)) + '-' + CAST(@StartMonth AS VARCHAR(2)) + '-01' AS DATE)

在结束日期,您可以使用CASE语句来标识该月的最后一天。不要忘记闰年。

答案 4 :(得分:0)

SqlServer 2012及更高版本支持 DATEFROMPARTS ()。可以这样:

    DECLARE @Month as int, @Year as int
    SET @Month = 8
    SET @Year = 2018
    SELECT DATEFROMPARTS(@Year,@Month,'01')

要获取月份的最后日期,可以使用 EOMONTH ()如下:

    SELECT EOMONTH(DATEFROMPARTS(@Year,@Month,'01'))

答案 5 :(得分:0)

您可以使用sql函数

Select cast(('01-'+h.[monthyear]) as date) from table1 h