3

如何构造一个 SQL 语句,该语句始终返回上一年 7 月 1 日的开始日期和基于 GETDATE() 的当年 6 月 30 日的结束日期?现在我有

    Dateadd(yy, Datediff(yy,1,GETDATE())-1,0) AS StartDate,
DateAdd(dd,-1,Dateadd(yy, Datediff(yy,0,GETDATE()),0)) AS EndDate

它将分别返回 2012 年 1 月 1 日和 2013 年 12 月 31 日。

4

4 回答 4

4

您可以在当前脚本中添加另一个 DATEADD() :

SELECT DATEADD(month,6,DATEADD(yy, DATEDIFF(yy,1,GETDATE())-1,0)) AS StartDate
      ,DATEADD(month,6,DATEADD(dd,-1,DATEADD(yy, DATEDIFF(yy,0,GETDATE()),0))) AS EndDate
于 2013-07-01T17:23:55.193 回答
2

这似乎是一个奇怪的要求。一种方法是构造日期字符串并解析它们:

select cast(cast(year(GETDATE()) - 1 as varchar(255))+'-07-01' as DATE) as StartDate,
       cast(cast(year(GETDATE()) as varchar(255))+'-06-30' as DATE) as EndDate

这将构造格式为 的字符串,'2013-06-30'对于大多数 SQL Server 日期设置,该字符串将被正确解释。

我相信(回忆 Aaron Bertrand 写的一些东西)省略连字符总是有效的:

select cast(cast(year(GETDATE()) - 1 as varchar(255))+'0701' as DATE) as StartDate,
       cast(cast(year(GETDATE()) as varchar(255))+'0630' as DATE) as EndDate

作为人类,我更喜欢使用连字符。

于 2013-07-01T17:21:06.080 回答
2

我一直在将此 CTE 用于基于当前日期的动态会计年度范围。它根据当前日期返回当前会计年度的开始日期和结束日期。

WITH FYDates AS (
 SELECT 
    CASE 
        WHEN MONTH(GETDATE()) IN (1, 2, 3, 4, 5, 6) 
        THEN CAST(CAST(YEAR(GETDATE()) - 1 AS VARCHAR) + '/07/01' AS DATE)
        ELSE CAST(CAST(YEAR(GETDATE()) AS VARCHAR) + '/07/01' AS DATE) END AS FYStartDate, 
    CASE
        WHEN MONTH(GETDATE()) IN (1, 2, 3, 4, 5, 6)
        THEN CAST(CAST(YEAR(GETDATE()) AS VARCHAR) + '/06/30' AS DATE) 
        ELSE CAST(CAST(YEAR(GETDATE()) + 1 AS VARCHAR) + '/06/30' AS DATE) END AS FYEndDate
),

您还可以将其创建为视图,以便在需要时引用它。

于 2016-02-02T15:31:13.990 回答
0

这应该适合你:

SELECT CAST('7/1/' + CAST(DATEPART(yy, Dateadd(yy, Datediff(yy,1,GETDATE())-1,0)) as varchar) as varchar) as startdate,
CAST('6/30/' + CAST(DATEPART(yy, Dateadd(yy, Datediff(yy,0,GETDATE()),0)) as varchar) as varchar) as enddate
于 2013-07-01T17:25:47.617 回答