我知道与计划相关的里程碑的年份和季度(例如“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?
答案 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 ;