Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中创建动态日期范围_Sql_Sql Server_Date_Date Range - Fatal编程技术网

在SQL中创建动态日期范围

在SQL中创建动态日期范围,sql,sql-server,date,date-range,Sql,Sql Server,Date,Date Range,如何构造一个SQL语句,该语句将根据GETDATE()始终返回上一年的开始日期7月1日,以及当前一年的结束日期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日。这似乎是一个奇怪的请求。一种方法是构造日期字符串并对其进行解

如何构造一个SQL语句,该语句将根据GETDATE()始终返回上一年的开始日期7月1日,以及当前一年的结束日期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日。这似乎是一个奇怪的请求。一种方法是构造日期字符串并对其进行解析:

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日期设置,该格式将在上正确解释

我相信(回想一下亚伦·伯特兰写的东西)省略连字符总是有效的:

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

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

您可以在当前脚本中添加另一个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

这应该适合您:

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

我一直在使用这个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
),

您也可以在需要时创建此视图作为参考。

谢谢。我尝试使用另一个DATEADD函数,但无法确切地知道如何使用它。这很好用。