将90天添加到创建日期

时间:2014-07-07 20:21:28

标签: sql sql-server tsql datetime

我抓住下一季度的第一天StartDate。我怎样才能添加90天。以下内容为EndDate中的StartDate提供了无效的列错误。

SELECT
    DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) + 1, 0) as StartDate,
    DATEADD(day, 90, MAX(StartDate)) as EndDate
FROM Survey
WHERE MainHospital = 'Hospital1'

Time_Stamp
-----------
2014-06-04 16:01:14.000
2014-06-04 15:55:33.000
2014-06-04 15:45:05.000
2014-06-04 15:36:15.000
2014-06-04 15:00:34.000
2014-06-04 14:35:24.000
2014-06-04 14:04:50.000
2014-06-04 13:46:55.000
2014-06-04 13:23:57.000
2014-06-04 11:27:51.000

仅供参考,我发现这非常有用: http://zarez.net/?p=2484

最终结果是这样的:

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'

3 个答案:

答案 0 :(得分:3)

它无效,因为StartDate是您日期计算的别名。只有在有结果时才能使用别名。换句话说,当您从服务器返回数据集时,别名可用。

例如,您可以使用子查询:

SELECT
  StartDate,
  DATEADD(day, 90, MAX(StartDate)) as EndDate
FROM (
  SELECT
     DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) + 1, 0) as StartDate
  FROM Survey
  WHERE MainHospital = 'Hospital1'
) DS

答案 1 :(得分:2)

sql查询不知道select中的列别名。这是一个自引用错误。 select语句创建别名,因此它不能自己使用别名。 select之后运行的唯一语句是order by,您可以在其中使用别名。

我会重用你的逻辑来防止需要子查询。由于90天只是另一个季度,因此将1更改为2并为时间戳添加另一个季度。

SELECT
    DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) + 1, 0) as StartDate,
    DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) + 2, 0) as EndDate
FROM Survey
WHERE MainHospital = 'Hospital1'

答案 2 :(得分:1)

您无法在同一查询中按名称引用派生列。你必须在这里添加相同的逻辑。

SELECT
DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) + 1, 0) as StartDate,
DATEADD(day, 90, DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) + 1, 0)) as EndDate
FROM Survey
WHERE MainHospital = 'Hospital1'

不太确定你在那里尝试用MAX做什么,所以我就把它删除了。