SQL从Year和Quarter创建DateTime值

时间:2011-05-17 22:09:49

标签: sql sql-server tsql

我知道与计划相关的里程碑的年份和季度(例如“2010”和“4”),我想从中选择/创建日期时间。有一些很好的方法可以用特定日期的格式(“qq”)来识别季度,但不能反过来(或者在那里?)。这是使用t-sql / SQL Server。

注意:日期时间应为该季度的最后天。

更新:这是我最终使用gbn提供的解决方案,使用AaronLS的变量名称,然后根据Frank Kalis的建议进行缩短和加糖:-)重要的是测试所有4个季度确保正确处理年份。感谢所有回答的人!

DECLARE @TheQuarter INT
DECLARE @theYear INT
-- Note: qq = q = quarter for the datepart
SET @TheQuarter = 1
SET @TheYear = 2011
SELECT DATEADD(YEAR, @TheYear-1900, DATEADD(qq, @TheQuarter, -1))
-- 2011-03-31 00:00:00.000

SET @TheQuarter = 2
SET @TheYear = 2011
SELECT DATEADD(YEAR, @TheYear-1900, DATEADD(qq, @TheQuarter, -1))
-- 2011-06-30 00:00:00.000

SET @TheQuarter = 3
SET @TheYear = 2011
SELECT DATEADD(YEAR, @TheYear-1900, DATEADD(qq, @TheQuarter, -1))
-- 2011-09-30 00:00:00.000

SET @TheQuarter = 4
SET @TheYear = 2011
SELECT DATEADD(YEAR, @TheYear-1900, DATEADD(qq, @TheQuarter, -1))
-- 2011-12-31 00:00:00.000

以下是从日期开始获取季度的几个问题,但不是相反: Calculate the Last Day in the CURRENT quarter; Calculate the last day of the quarter; Best way to store quarter and year in SQL Server?

4 个答案:

答案 0 :(得分:9)

永远不要使用字符串进行日期转换:格式,语言等方面的问题太多了。

将其保留在日期时间类型...

Select dateadd(day, -1, 
                       dateadd(year, @year-1900,
                                          dateadd(quarter, @qq, 0)
                                     )
             )

答案 1 :(得分:4)

看起来你已经找到了解决方案,但仅仅是为了它... 如果您选择不同的基准日期,则可以将整个事项缩短为

SELECT DATEADD(YEAR, @TheYear-1900, DATEADD(qq, @TheQuarter, -1))

由于0表示SQL Server的基准日期为01.01.1900(以及一个月的第一天),因此使用-1作为基准日期会提前1天开始,然后您已经拥有了一个月的最后一天(并且四分之一)。然后你只需要做其余的日期时间魔术和vo。

答案 2 :(得分:2)

只需选择季度中的日期:

select
    case @theQuarter
        when 1 then '3/31/' + cast(@theYear as varchar(4))
        when 2 then '6/30/' + cast(@theYear as varchar(4))
        when 3 then '9/30/' + cast(@theYear as varchar(4))
        when 4 then '12/31/' + cast(@theYear as varchar(4))
    end as quarterDate

修改:调整为季度的最后一天而不是第一天。

答案 3 :(得分:1)

这基本上是下一季度的第一天,然后减去一个,这样你就可以得到你想要的季度的最后一天。 (@theQuarter + 1)在季度中添加一个,然后*3 -2获得该季度的第一个月,并且在第四季度需要% 12,因为您添加1到4以获得5,这给出了你13但你真的想要1,所以%照顾它。

最后将它全部投放到日期时间之后,我们将在下一季度的第一天,因此在结尾处减去- 1以减去一天并获得我们最初投入的季度的最后一天。

declare @theQuarter as int;
set @theQuarter = 4;

declare @theYear as int;
set @theYear = 2009;

select 
cast(
  cast(
        ( (@theQuarter + 1) * 3 - 2) % 12 
  as varchar(2)) 
  + '-01-' 
  + cast( (@theYear + (((@theQuarter + 1) * 3 - 2)/ 12) ) as varchar(4))  
as datetime) - 1 ;