[SQL] 2 개 날짜 매개 변수를 포함하는 가장 쉬운 사이의 날짜와 임시 테이블을 채우는 방법 및
SQL2 개 날짜 매개 변수를 포함하는 가장 쉬운 사이의 날짜와 임시 테이블을 채우는 방법 및
어떤 것은 날짜를 포함한 2 개 날짜 매개 변수 사이에 임시 테이블을 채우는 가장 쉬운 방법입니다. 난 단지 달 날짜의 1 일이 필요합니다.
그래서 예를 들어 @StartDate = '2011-01-01'와 @EndDate = '2011-08-01'을하는 경우
그럼이 표에 반환 할
2011-01-01
2011-02-01
2011-03-01
2011-04-01
2011-05-01
2011-06-01
2011-07-01
2011-08-01
해결법
-
==============================
1.이것은 @StartDate이 달의 첫 번째없는 경우에도 작동합니다. 나는 달의 시작이 아니라면, 당신은 다음 달의 첫 번째 시작하려는 있으리라 믿고있어. 그렇지 않으면 하나를 제거 :
이것은 @StartDate이 달의 첫 번째없는 경우에도 작동합니다. 나는 달의 시작이 아니라면, 당신은 다음 달의 첫 번째 시작하려는 있으리라 믿고있어. 그렇지 않으면 하나를 제거 :
;WITH cte AS ( SELECT CASE WHEN DATEPART(Day,@StartDate) = 1 THEN @StartDate ELSE DATEADD(Month,DATEDIFF(Month,0,@StartDate)+1,0) END AS myDate UNION ALL SELECT DATEADD(Month,1,myDate) FROM cte WHERE DATEADD(Month,1,myDate) <= @EndDate ) SELECT myDate FROM cte OPTION (MAXRECURSION 0)
-
==============================
2.
declare @StartDate date = '2014-01-01'; declare @EndDate date = '2014-05-05'; ;WITH cte AS ( SELECT @StartDate AS myDate UNION ALL SELECT DATEADD(day,1,myDate) as myDate FROM cte WHERE DATEADD(day,1,myDate) <= @EndDate ) SELECT myDate FROM cte OPTION (MAXRECURSION 0)
-
==============================
3.
declare @StartDate datetime declare @EndDate datetime select @StartDate = '2011-01-01' , @EndDate = '2011-08-01' select @StartDate= @StartDate-(DATEPART(DD,@StartDate)-1) declare @temp table ( TheDate datetime ) while (@StartDate<=@EndDate) begin insert into @temp values (@StartDate ) select @StartDate=DATEADD(MM,1,@StartDate) end select * from @temp
@StartDate이 달 1 일이 아닌 경우에도 STARTDATE의 달의 첫 날에 다시 이동하여 작동
-
==============================
4.이 SQL 2008 R2에서 테스트
이 SQL 2008 R2에서 테스트
Declare @StartDate datetime = '2015-03-01' Declare @EndDate datetime = '2015-03-31' declare @temp Table ( DayDate datetime ); WHILE @StartDate <= @EndDate begin INSERT INTO @temp (DayDate) VALUES (@StartDate); SET @StartDate = Dateadd(Day,1, @StartDate); end ; select * from @temp
결과:
DayDate ----------------------- 2015-03-01 00:00:00.000 2015-03-02 00:00:00.000 2015-03-03 00:00:00.000 2015-03-04 00:00:00.000 ...
-
==============================
5.해결책:
해결책:
DECLARE @StartDate DATETIME ,@EndDate DATETIME; SELECT @StartDate = '20110105' ,@EndDate = '20110815'; SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, DATEADD(MONTH, v.number, @StartDate)), 0) AS FirstDay --or Andriy M suggestion: --SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, @StartDate) + v.number, 0) AS FirstDay INTO #Results FROM master.dbo.spt_values v WHERE v.type = 'P' AND DATEDIFF(MONTH, @StartDate, @EndDate) >= v.number; SELECT * FROM #Results; DROP TABLE #Results;
결과 :
FirstDay ----------------------- 2011-01-01 00:00:00.000 2011-02-01 00:00:00.000 2011-03-01 00:00:00.000 2011-04-01 00:00:00.000 2011-05-01 00:00:00.000 2011-06-01 00:00:00.000 2011-07-01 00:00:00.000 2011-08-01 00:00:00.000
-
==============================
6.흥미롭게도,이 글에 따라 열거 된 데이터로부터 생성 빠릅니다.
흥미롭게도,이 글에 따라 열거 된 데이터로부터 생성 빠릅니다.
DECLARE @StartDate DATE = '10001201'; DECLARE @EndDate DATE = '20000101'; DECLARE @dim TABLE ([date] DATE) INSERT @dim([date]) SELECT d FROM ( SELECT d = DATEADD(DAY, rn - 1, @StartDate) FROM ( SELECT TOP (DATEDIFF(DAY, @StartDate, @EndDate)) rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id]) FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2 ORDER BY s1.[object_id] ) AS x ) AS y;
내 컴퓨터에, 그것은 큰 날짜 범위에 약 60 % 더 빠르다. 내가 정말 증가 일 동안이 방법을 권장하지 않도록 재귀 방법은, 비록 약 3 초 만에 데이터 2000 년의 가치를 채우고 많이 좋네요 보이는 수 있습니다.
-
==============================
7.널 날짜 수정 :
널 날짜 수정 :
IF OBJECT_ID('tempdb..#dim') IS NOT NULL DROP TABLE #dim CREATE TABLE #dim ([date] DATE) if not @Begin_Date is null and not @End_Date is null begin INSERT #dim([date]) SELECT d FROM( SELECT d = DATEADD(DAY, rn - 1, @Begin_Date) FROM ( SELECT TOP (DATEDIFF(DAY, @Begin_Date, @End_Date)) rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id]) FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2 ORDER BY s1.[object_id] ) AS x ) AS y; end
-
==============================
8.
CREATE TABLE #t (d DATE) INSERT INTO #t SELECT GETDATE() GO INSERT #t SELECT DATEADD(DAY, -1, MIN(d)) FROM #t GO 10
from https://stackoverflow.com/questions/7812986/easiest-way-to-populate-a-temp-table-with-dates-between-and-including-2-date-par by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] dataframe 기능 대 스파크 SQL 쿼리 (0) | 2020.04.15 |
---|---|
[SQL] 분할 다중 행으로 SQL 열의 값을 구분 (0) | 2020.04.15 |
[SQL] 어떻게 MySQL의에서 슬래시 (\)를 검색하려면? (\) 이스케이프 왜 요구되는 경우 (=)하지만처럼을 위해 필요하지? (0) | 2020.04.15 |
[SQL] 오라클의 CLOB 컬럼을 조회하는 방법 (0) | 2020.04.15 |
[SQL] 왜 SQL에는 제품 집계 함수가 없다? (0) | 2020.04.15 |