[SQL] SQL 서버 : 날짜 범위를 계산
SQLSQL 서버 : 날짜 범위를 계산
나는 현재 날짜 (전년 대비)이 월 (전년 대비)의 시작 부분에서 날짜 범위를 얻기 위해 노력하고있어. 이 코드를 단순화 할 수있는 방법이 있습니까?
SELECT 'From the beginning of month to this day, previous year' AS Label,
CONVERT (DATETIME, CAST (DATEPART(YY, GETDATE()) - 1 AS CHAR (4)) + CASE
WHEN DATEPART(MM, GETDATE()) < 10 THEN '-0' + CAST (DATEPART(MM, GETDATE()) AS CHAR (1)) ELSE '-' + CAST (DATEPART(MM, GETDATE()) AS CHAR (2))
END + '-01') AS Begin_date,
CONVERT (DATETIME, CAST (DATEPART(YY, GETDATE()) - 1 AS CHAR (4)) + CASE
WHEN DATEPART(MM, GETDATE()) < 10 THEN '-0' + CAST (DATEPART(MM, GETDATE()) AS CHAR (1)) ELSE '-' + CAST (DATEPART(MM, GETDATE()) AS CHAR (2))
END + CASE
WHEN DATEPART(DD, GETDATE()) < 10 THEN '-0' + CAST (DATEPART(DD, GETDATE()) AS CHAR (1)) ELSE '-' + CAST (DATEPART(DD, GETDATE()) AS CHAR (2))
END) AS End_date
해결법
-
==============================
1.
SELECT 'Anything' as Label ,DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) as firstdaythismonth ,DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0) as today ,DATEADD(year, -1, DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)) as firstdaythismonth_lastyear ,DATEADD(year, -1, DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)) as today_lastyear
-
==============================
2.
SELECT DATEADD(yy, -1, CONVERT(VARCHAR(25), DATEADD(dd,-(DAY(GETDATE())-1),GETDATE()),101)) AS Date_Value, 'First Day of Current Month Of Last Year' AS Date_Type UNION SELECT DATEADD(yy, -1, GETDATE()) AS TodayLastYear, 'Today Last Year'
또는 당신은 단지 값없이 설명을 원하는 경우
SELECT DATEADD(yy, -1, CONVERT(VARCHAR(25), DATEADD(dd,-(DAY(GETDATE())-1),GETDATE()),101)) UNION SELECT DATEADD(yy, -1, GETDATE()) AS TodayLastYear
당신은 DATEADD를 사용하고 빼기 년에 전년 동기 대비 지정합니다. 그냥 음의 값을 사용합니다.
나는 또한 내가 사용하는 일반적인 날짜 함수의 집합을 공유 할 수 있습니다. 그냥 테이블 반환 함수로이 작성 :
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go CREATE FUNCTION [dbo].[udfCommonDates] (@date datetime) RETURNS @t table (week_start datetime, week_end datetime, lastweek_start datetime, lastweek_end datetime, month_start datetime, month_end datetime, lastmonth_start datetime, lastmonth_end datetime, yesterday_start datetime, yesterday_end datetime, today_start datetime, today_end datetime, thisweek_monday_start datetime, thisweek_monday_end datetime, year_start datetime, year_end datetime, tomorrow_noon datetime, today_noon datetime, date_only datetime) BEGIN INSERT @t SELECT dbo.get_week_start ( @date ) AS week_start, dbo.get_week_end ( @date ) AS week_end, dbo.get_week_start ( DATEADD(d, -7, @date ) ) AS lastweek_start, dbo.get_week_end ( DATEADD(d, -7, @date ) ) AS lastweek_end, dbo.get_month_start( @date ) AS month_start, dbo.get_month_end ( @date ) AS month_end, dbo.get_month_start ( DATEADD(m,-1, @date) ) AS lastmonth_start, dbo.get_month_end ( DATEADD(m,-1,@date) ) AS lastmonth_end, dbo.get_yesterday_start ( @date ) AS yesterday_start, dbo.get_yesterday_end ( @date ) AS yesterday_end, dbo.get_today_start (@date) AS today_start, dbo.get_today_end ( @date ) AS today_end, dbo.get_weekday_start(1,@date) AS thisweek_monday_start, dbo.get_weekday_end(1,@date) AS thisweek_monday_end, dbo.get_year_start(@date) AS year_start, dbo.get_year_end(@date) AS year_end, dbo.get_tomorrow_noon(@date) AS TomorrowNoon, dbo.get_today_noon(@date) AS TodayNoon, dbo.get_date_only(@date) AS DateOnly RETURN END
여기에 이들에 대한 스칼라 값 함수는 다음과 같습니다
CREATE FUNCTION [dbo].[get_date_only] (@date datetime) RETURNS datetime WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT AS BEGIN RETURN dateadd(day, DateDiff(day, 0, GetDate()), 0) END GO CREATE FUNCTION [dbo].[get_month_end] (@date datetime) RETURNS datetime WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT AS BEGIN RETURN dateadd(ms, -3, dateadd (m,datediff(m,0, dateadd(m,1,@date)),0)) END GO CREATE FUNCTION [dbo].[get_month_start] (@date datetime) RETURNS datetime WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT AS BEGIN RETURN dateadd(m,datediff(m,0, @date),0) END GO CREATE FUNCTION [dbo].[get_today_end] (@today datetime) RETURNS datetime WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT AS BEGIN return dateadd(ms, -3, datediff(d,0,dateadd(d,1,@today))) END GO CREATE FUNCTION [dbo].[get_today_noon](@date datetime) RETURNS datetime WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT AS BEGIN RETURN DATEADD(hh, 12, DATEADD(d,DATEDIFF(d,0, @date),0)) END GO CREATE FUNCTION [dbo].[get_today_start] (@today datetime) RETURNS datetime WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT AS BEGIN return dateadd(day, 0, datediff(d,0,@today)) END GO CREATE FUNCTION [dbo].[get_tomorrow_noon](@date datetime) RETURNS datetime WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT AS BEGIN RETURN DATEADD(hh, 12, DATEADD(d,DATEDIFF(d,-1, @date),0)) END GO CREATE FUNCTION [dbo].[get_week_end] (@date datetime) RETURNS datetime WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT AS BEGIN return dateadd(yyyy, datepart(yyyy, dateadd(weekday,7-datepart(weekday, @date),@date))-1900, 0) + dateadd(ms, -3, dateadd(dy, datepart(dy, dateadd(weekday,7-datepart(weekday, @date),@date)),0) ) END GO CREATE FUNCTION [dbo].[get_week_start] (@date datetime) RETURNS datetime WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT AS BEGIN return dateadd(yyyy, datepart(yyyy, dateadd(weekday,1-datepart(weekday, @date),@date))-1900, 0) + dateadd(dy, datepart(dy, dateadd(weekday,1-datepart(weekday, @date),@date))-1,0) END GO CREATE FUNCTION [dbo].[get_weekday_end] (@weekday tinyint, @date datetime) RETURNS datetime WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT AS BEGIN return dateadd(yyyy, datepart(yyyy, dateadd(weekday,@weekday- datepart(weekday, @date),@date))-1900, 0) + dateadd(ms, -3, dateadd(dy, datepart(dy, dateadd(weekday,@weekday-datepart(weekday, @date), @date)),0) ) END GO CREATE FUNCTION [dbo].[get_weekday_start] (@weekday tinyint, @date datetime) RETURNS datetime WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT AS BEGIN return dateadd(yyyy, datepart(yyyy, dateadd(weekday,@weekday- datepart(weekday, @date),@date))-1900, 0) + dateadd(dy, datepart(dy, dateadd(weekday,@weekday-datepart(weekday, @date), @date))-1,0) END GO CREATE FUNCTION [dbo].[get_year_end] (@date datetime) RETURNS datetime WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT AS BEGIN RETURN DATEADD(year, DATEDIFF(year, 0, GetDate())+1, 0)-1 END GO CREATE FUNCTION [dbo].[get_year_start] (@date datetime) RETURNS datetime WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT AS BEGIN RETURN DATEADD(year,DATEDIFF(year,0, @date),0) END GO CREATE FUNCTION [dbo].[get_yesterday_end] (@today datetime) RETURNS datetime WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT AS BEGIN return dateadd(ms, -3, datediff(d,0,@today)) END GO CREATE FUNCTION [dbo].[get_yesterday_start] (@today datetime) RETURNS datetime WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT AS BEGIN RETURN dateadd(day, -1, datediff(d,0,@today)) END GO
내가 날짜 매개 변수에 대한 서비스를보고이 사용하기 때문에이 나를 위해 정말 도움이되었다. 당신은 단순히이 테이블 함수를 참조하는 데이터 집합을 만든 다음 RS 내의 모든 날짜의 매개 변수에 다음을 사용할 수 있습니다.
당신과 같이이 전체 테이블 반환 함수를 실행할 수 있습니다 :
SELECT [보기 MyDB] * FROM. DBO]. udfCommonDates (에 GetDate ())
결과는 매우 비슷
지금은 이전에 내가보고 서비스를 위해 이러한 사용을 언급했다. 이제 RS의 사람들은 생각 될 수 있지만 나는 데이터 집합을 필요로하고 데이터 집합 만 저장 프로 시저 또는 직접 테이블을 기반으로 할 수있는 도움말을 나를 어떻게하는지. 어떤 문제는 다음과 같은 저장 프로 시저를 만들 수 없습니다 :
CREATE PROCEDURE [dbo].[uspCommonDates] AS begin set datefirst 1 declare @date datetime set @date = getdate() select * from dbo.udfCommonDates(@date) end
이제 서비스가 새로운 데이터 세트를 추가보고 지금 ... 데이터 세트로 사용하는 저장 프로 시저를 가지고 :
이제 보고서의 보고서 매개 변수 섹션으로 이동 :
이제 데이터 세트 dsFunctions을 선택 (또는 당신이 그것을라고 무엇이든) 다음과 같은 라 함수의 값 필드 중 하나를 선택 :
보고서를 실행할 때 이제 스칼라를 사용합니다 :
-
==============================
3.당신은 도움이되는 DATEADD 함수를 사용할 수 있습니다 :
당신은 도움이되는 DATEADD 함수를 사용할 수 있습니다 :
SELECT 'From the beginning of month to this day, previous year' AS Label, DATEADD(YY,-1,DATEADD(DD,-(day(getdate())-1),DATEDIFF(dd, 0, GETDATE()))) AS Begin_date, DATEADD(YY,-1,DATEDIFF(dd, 0, GETDATE())) AS End_date
-
==============================
4.2010-04-01의 경우, 약 2010-04-04 방법;
2010-04-01의 경우, 약 2010-04-04 방법;
SELECT CAST(DATEADD(DAY, -365 + -(DAY(GETDATE())-1), GETDATE()) AS DATE), CAST(DATEADD(YEAR, -1, GETDATE()) AS DATE)
-
==============================
5.
SELECT 'From the beginning of month to this day, previous year' AS Label, CONVERT(DATETIME,LEFT(CONVERT(VARCHAR(6),DATEADD(YEAR,-1,GETDATE()),112),6)+'01') Begin_date, DATEADD(YEAR,-1,GETDATE()) End_date
from https://stackoverflow.com/questions/5539517/sql-server-calculating-date-ranges by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 테이블 별칭 - 좋은 또는 나쁜? [닫은] (0) | 2020.06.09 |
---|---|
[SQL] 데이터베이스에서 고유 인덱스 컬럼 값을 스왑 (0) | 2020.06.09 |
[SQL] 이유는 "프로 시저 매개 변수 '@statement'유형의 'NTEXT / NCHAR / NVARCHAR'를 기대하고있다."받을 수 있나요 나는 sp_executesql을 사용하려고 할 때? (0) | 2020.06.09 |
[SQL] 는 SQL 쿼리에 사용되는 테이블 목록 (0) | 2020.06.09 |
[SQL] DB2의 쿼리에서 구분 된 문자열을 만들기 (0) | 2020.06.09 |