2014-07-08 78 views
0

下面的查询显示了给定日期(最近在Time_Stamp列中)的后三个季度的第一天和最后一天。我试图改变输出结构以显示第二个查询。格式化此日期范围的输出查询结果

Time_Stamp

Time_Stamp 
----------- 
2014-06-04 16:01:14.000 
2014-06-04 15:55:33.000 
2014-06-04 15:45:05.000 

新建查询

SELECT 
    --first day of next quarter 
    DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) + 1, 0) as StartDate, 
    --last day of next quarter 
    DATEADD (dd, -1, DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) +2, 0)) as EndDate, 
    --first day 2 quarters ahead 
    DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) + 2, 0) as StartDate, 
    --last day, 2 quarters ahead 
    DATEADD (dd, -1, DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) +3, 0)) as EndDate, 
    --first day 3 quarters ahead 
    DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) + 3, 0) as StartDate, 
    --last day 3 quarters ahead 
    DATEADD (dd, -1, DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) +4, 0)) as EndDate 
FROM Survey 
WHERE MainHospital = 'Hospital1' 

输出

StartDate    EndDate     StartDate    EndDate     StartDate    EndDate 
----------------------- ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- 
2014-07-01 00:00:00.000 2014-09-30 00:00:00.000 2014-10-01 00:00:00.000 2014-12-31 00:00:00.000 2015-01-01 00:00:00.000 2015-03-31 00:00:00.000 

第二查询其给出错误的日期,但首选格式:

WITH Start AS 
(
    SELECT 
     -- Returns first day of next quarter 
     DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) + 1, 0) as StartDate, 
     -- Returns last day of next quarter 
     DATEADD (dd, -1, DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) +2, 0)) as EndDate 
    FROM Survey 
    WHERE MainHospital = 'Hospital1'  
), 
Results AS 
(
    SELECT StartDate, EndDate from Start 
    UNION 
    SELECT DATEADD(DAY, 1, EndDate), DATEADD(day, 91, EndDate) FROM Start 
    UNION 
    SELECT DATEADD(DAY, 92, EndDate), DATEADD(day, 182, EndDate) FROM Start 
) 
SELECT LEFT(StartDate,11) AS StartDate, LEFT(EndDate,11) AS EndDate FROM Results` 

首选输出格式:

StartDate EndDate 
----------- ----------- 
Jul 1 2014 Sep 30 2014 
Oct 1 2014 Dec 30 2014 
Dec 31 2014 Mar 31 2015 
+0

你已经基本上问同样的问题约3-4倍现在,这是一个类,你不明白的季度日期开始和结束的SQL?这是给你几次。 –

+0

如果你想检查,我也为Kevin Cook每次创建了答案。如果你想帮忙而不是巨魔,我又添加了一个新的答案。 – user3749447

+0

这些是完全不同的问题,我自己拿到了四分之一的日期。这个你决定投降的问题并没有要求提供季度日期。只格式化。 – user3749447

回答

1

您可能不得不调整它有点以适应你的代码,但是这应该得到你正在寻找的日期格式:

SELECT CONVERT(VARCHAR(12), StartDate, 107) AS StartDate 

我用这个作为日期时间的参考,这是非常有帮助的: http://www.sql-server-helper.com/tips/date-formats.aspx

0
SELECT TOP 1 
    --first day of next quarter  
CONVERT(VARCHAR(12),DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) + 1, 0)) as StartDate, 
    --last day of next quarter 
CONVERT(VARCHAR(12),DATEADD (dd, -1, DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) +2, 0))) as EndDate, 
    --first day 2 quarters ahead 
CONVERT(VARCHAR(12),DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) + 2, 0)) as StartDate, 
    --last day, 2 quarters ahead 
CONVERT(VARCHAR(12),DATEADD (dd, -1, DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) +3, 0))) as EndDate, 
    --first day 3 quarters ahead 
CONVERT(VARCHAR(12),DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) + 3, 0)) as StartDate, 
    --last day 3 quarters ahead 
CONVERT(VARCHAR(12),DATEADD (dd, -1, DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) +4, 0))) as EndDate 
FROM Survey 
Where MainHospital = 'Hospital1' 
GROUP BY Time_Stamp 
ORDER BY Time_Stamp DESC 

得到日期格式,但不是在2列

StartDate EndDate  StartDate EndDate  StartDate EndDate 
------------ ------------ ------------ ------------ ------------ ------------ 
Jul 1 2014 Sep 30 2014 Oct 1 2014 Dec 31 2014 Jan 1 2015 Mar 31 2015 
1
DECLARE @TimeTable TABLE 
(Time_Stamp DATETIME) 

INSERT INTO @TimeTable 
(Time_Stamp) 
VALUES 
('2011-06-04 16:01:14.000'), 
('2014-06-04 16:01:14.000'), 
('2014-06-04 15:55:33.000'), 
('2014-06-04 15:45:05.000');  

SELECT CONVERT(VARCHAR(12),DATEADD(QUARTER, n.number + 1, t.BeginYear)) as StartDate, 
    CONVERT(VARCHAR(12),DATEADD(SECOND, - 1, DATEADD(QUARTER, n.number + 2, t.BeginYear))) as EndDate 
FROM 
(
    select top 400 row_number() over(order by t1.number) as number 
    from master..spt_values t1 
    cross join master..spt_values t2 
) n 
OUTER APPLY 
(
    SELECT DATEADD(YEAR, DATEDIFF(YEAR, 0, MIN(t.Time_Stamp)), 0) BeginYear, MAX(t.Time_Stamp) MaxDate FROM @TimeTable t 
) t 
WHERE DATEADD(QUARTER, n.number, t.BeginYear) < DATEADD(QUARTER, +2, t.MaxDate) 

我创建为您的业务规则希望再申请对最后日期后产生从第一次约会到3个季度的所有季度值的数字表您的数据显示开始和结束日期。

我增加了一个奇怪的日期在2011年显示出整体的流动,这将有更多的记录比你的例子 这里是输出:

StartDate EndDate 
Jul 1 2011  Sep 30 2011 
Oct 1 2011  Dec 31 2011 
Jan 1 2012  Mar 31 2012 
Apr 1 2012  Jun 30 2012 
Jul 1 2012  Sep 30 2012 
Oct 1 2012  Dec 31 2012 
Jan 1 2013  Mar 31 2013 
Apr 1 2013  Jun 30 2013 
Jul 1 2013  Sep 30 2013 
Oct 1 2013  Dec 31 2013 
Jan 1 2014  Mar 31 2014 
Apr 1 2014  Jun 30 2014 
Jul 1 2014  Sep 30 2014 
Oct 1 2014  Dec 31 2014 
Jan 1 2015  Mar 31 2015 
+0

master..spt_values是一个系统表,这部分只是用来创建一个数字表。 –

+0

如果您只是希望最后3条记录基于表中的最大值,那么只需更改DATEADD(YEAR,DATEDIFF(YEAR,0,MIN(t.Time_Stamp)),0)BeginYear从最小值到最大值。 –

+0

我将在哪里设置我原来的WHERE参数FROM Survey? – user3749447