TSQL에서 날짜로부터 분기별 캘린더를 가져오는 방법
나는 한 칸에 다른 날짜가 있습니다.예:
20080102
20070821
저는 이 날짜들을 연도와 달력 분기로 변환하고 싶습니다.예.,
Year Quarter
2008 2008-Q1
2007 2007-Q3
다음을 사용하여 첫 번째 열을 얻을 수 있습니다.
select left(date,4) as year from table
제가 어떻게 두 번째 칼럼을 제작할 수 있습니까?
SELECT DATEPART(QUARTER, @date)
이것은 4분의 1을 반환합니다.@date
가정하에@date
이다.DATETIME
.
SELECT DATENAME(Quarter, CAST(CONVERT(VARCHAR(8), datecolumn) AS DATETIME))
제가 하는 방법은 이렇습니다.꽤 간략하고 임시 테이블에 의존하지 않습니다.
CAST(year(TheDate) AS char(4)) + '-Q' +
CAST(CEILING(CAST(month(TheDate) AS decimal(9,2)) / 3) AS char(1))
예를 들어,
SELECT convert(char(10), getdate(), 101) AS TheDate,
CAST(year(getdate()) AS char(4)) + '-Q' +
CAST(CEILING(CAST(month(getdate()) AS decimal(4,2)) / 3) AS char(1)) AS SelectQuarter
다음과 같이 반환됩니다.
TheDate SelectQuarter
---------- -------------
07/10/2013 2013-Q3
분명히 문자열 자체는 사용자 자신의 형식에 맞게 변경될 수 있습니다.이것이 도움이 되기를 바랍니다.
여기 다른 옵션이 있습니다.CTE를 사용하여 분기의 월을 정의한 후 분기를 결정합니다.
WITH Quarters AS (
SELECT Q = 'Q1', MonthBegin = 1, MonthEnd = 3 UNION
SELECT Q = 'Q2', MonthBegin = 4, MonthEnd = 6 UNION
SELECT Q = 'Q3', MonthBegin = 7, MonthEnd = 9 UNION
SELECT Q = 'Q4', MonthBegin = 10, MonthEnd = 12
)
SELECT
[Year] = DATEPART(yyyy, CONVERT(DATETIME, Dates.[date])),
[Quarter] = CONVERT(VARCHAR(4), DATEPART(yyyy, CONVERT(DATETIME, Dates.[date]))) + '-' + q.Q
FROM
(VALUES
('20080102'),
('20070821')
) AS Dates ([date])
INNER JOIN Quarters q ON
DATEPART(m, CONVERT(DATETIME, Dates.[date])) >= q.MonthBegin AND
DATEPART(m, CONVERT(DATETIME, Dates.[date])) <= q.MonthEnd;
반환:
Year Quarter
----- ----------
2008 2008-Q1
2007 2007-Q3
int의 핸들 칼럼 유형(04/23/2014):
WITH Quarters AS (
SELECT Q = 'Q1', MonthBegin = 1, MonthEnd = 3 UNION
SELECT Q = 'Q2', MonthBegin = 4, MonthEnd = 6 UNION
SELECT Q = 'Q3', MonthBegin = 7, MonthEnd = 9 UNION
SELECT Q = 'Q4', MonthBegin = 10, MonthEnd = 12
)
SELECT
[Year] = DATEPART(yyyy, CONVERT(DATETIME, CONVERT(VARCHAR(8), Dates.[date]))),
[Quarter] = CONVERT(VARCHAR(4), DATEPART(yyyy, CONVERT(DATETIME, CONVERT(VARCHAR(8), Dates.[date])))) + '-' + q.Q
FROM
(VALUES
(20080102),
(20070821)
) AS Dates ([date])
INNER JOIN Quarters q ON
DATEPART(m, CONVERT(DATETIME, CONVERT(VARCHAR(8), Dates.[date]))) >= q.MonthBegin AND
DATEPART(m, CONVERT(DATETIME, CONVERT(VARCHAR(8), Dates.[date]))) <= q.MonthEnd;
다음과 같이 했습니다(SQL Server 사용 중).
SELECT 'Q' + cast(DATEPART(QUARTER, GETDATE()) as varchar(1)) + ' - ' + cast(DATEPART(YEAR, GETDATE()) as varchar(4)) AS 'Date Quarter'
날짜 필드 데이터가 다음에 있으므로int
날짜/시간으로 변환해야 합니다.
declare @date int
set @date = 20080102
SELECT Datename(quarter, Cast(left(@date, 4) + '-'
+ substring(cast(@date as char(8)), 5, 2) + '-'
+ substring(cast(@date as char(8)), 7, 2) as datetime)) as Quarter
또는
SELECT Datename(quarter, Cast(left(@date, 4) + '-'
+ substring(cast(@date as char(8)), 5, 2) + '-'
+ right(@date, 2) as datetime)) as quarter
그렇다면 당신이 원한다면,Q1
추가됨:
SELECT left(@date, 4) + '-Q' + Convert(varchar(1), Datename(quarter, Cast(left(@date, 4) + '-'
+ substring(cast(@date as char(8)), 5, 2) + '-'
+ right(@date, 2) as datetime))) as quarter
제 조언은 당신을 저장하는 것입니다.date
데이터로서의datetime
따라서 이러한 변환을 수행할 필요가 없습니다.
요청한 정확한 출력을 얻으려면 다음을 사용하십시오.
CAST(DATEPART(YEAR, @Date) AS NVARCHAR(10)) + ' - Q' + CAST(DATEPART(QUARTER, @Date) AS NVARCHAR(10))
그러면 "2015 - Q1", "2013 - Q3" 등의 출력이 제공됩니다.
컨버터와 빈둥거리기에 좋은 변명.아마도 더 예쁜 방법:
create table the_table
(
[DateKey] INT,
)
insert into the_table
values
(20120101),
(20120102),
(20120201),
(20130601)
WITH myDateCTE(DateKey, Date) as
(
SELECT
DateKey
,[Date] = CONVERT(DATETIME, CONVERT(CHAR(8),DateKey),112)
FROM the_table
)
SELECT
t.[DateKey]
, m.[Date]
, [QuarterNumber] = CONVERT(VARCHAR(20),Datepart(qq,Date))
, [QuarterString] = 'Q' + CONVERT(VARCHAR(20),Datepart(qq,Date))
, [Year] = Datepart(yyyy,Date)
, [Q-Yr] = CONVERT(VARCHAR(2),'Q' + CONVERT(VARCHAR(20),Datepart(qq,Date))) + '-' + CONVERT(VARCHAR(4),Datepart(yyyy,Date))
FROM
the_table t
inner join myDateCTE m
on
t.DateKey = m.DateKey
SELECT
Q.DateInQuarter,
D.[Year],
Quarter = D.Year + '-Q'
+ Convert(varchar(1), ((Q.DateInQuarter % 10000 - 100) / 300 + 1))
FROM
dbo.QuarterDates Q
CROSS APPLY (
VALUES (Convert(varchar(4), Q.DateInQuarter / 10000))
) D ([Year])
;
SQL Fiddle에서 실시간 데모 보기
필드 데이터 유형 INT 및 필드 이름 "mydate"를 가정합니다.OP 질문에서 문자열로 변환할 때 INT 날짜 값은 ISO 날짜 리터럴입니다.
select DatePart(QUARTER, cast(cast(mydate as char(8)) as date))
이전 서버 버전을 사용하는 경우 날짜 시간을 사용할 수 있습니다.
이거 드셔보세요.
SELECT CONCAT (TO_CHAR(sysdate,'YYYY-'),concat ('Q',TO_CHAR(sysdate,'Q') ))from dual
교체하다sysdate
사용자 자신의 열 이름과 날짜 유형 형식 및dual
당신의 테이블 이름과
정수를 문자(8)로 변환한 다음 날짜 시간으로 변환해야 합니다.그런 다음 SELECT DATE PART(분기, [날짜])로 포장합니다.
그런 다음 위의 내용을 문자로 변환하고 '-' + 연도를 추가해야 합니다(문자로도 변환됨).
위의 산술 오버플로는 초기 변환을 문자 형식으로 생략하여 발생합니다.
가능한 경우 뷰를 사용하여 날짜-시간으로 변환을 추상화한 다음 필요에 따라 분기 함수와 문자 변환을 사용하는 경향이 있습니다.
다음은 더 많은 대안 중 하나입니다.
SELECT CASE
WHEN @TODAY BETWEEN @FY_START AND DATEADD(M, 3, @FY_START) THEN 'Q1'
WHEN @TODAY BETWEEN DATEADD(M, 3, @FY_START) AND DATEADD(M, 6, @FY_START) THEN 'Q2'
WHEN @TODAY BETWEEN DATEADD(M, 6, @FY_START) AND DATEADD(M, 9, @FY_START) THEN 'Q3'
WHEN @TODAY BETWEEN DATEADD(M, 9, @FY_START) AND DATEADD(M, 12, @FY_START) THEN 'Q4'
END
기능 사용MONTH
월을 숫자로 반환하면 분기를 쉽게 계산할 수 있습니다.
select date, CEILING((MONTH(date) * 4) / 12) quarter from dual
declare @TempTable table([Date] datetime)
insert into @TempTable([Date])
values('2008-01-02'),('2007-08-21')
select datepart(year, [Date]) as [year]
,convert(varchar(10),datepart(year, [Date])) + '-Q' + convert(varchar(3),datename(quarter, [Date])) as quarter_with_year
,datefromparts(datepart(year, [Date]),(convert(varchar(3),datename(quarter, [Date])) * 3)-2,1) as quarter_startdate
,eomonth(datefromparts(datepart(year, [Date]),convert(varchar(3),datename(quarter, [Date])) * 3,1)) as quarter_enddate
FROM @TempTable
분기의 연도, 분기 및 시작 종료 날짜를 반환합니다.
select
your_date,
CONCAT (TO_CHAR(your_date, 'YYYY-'),concat ('Q', date_part(quarter, your_date) ))
from table;
DECLARE @QuarterVar TINYINT
SELECT @QuarterVar = ( ( ( DATEPART( month, GETDATE( ) ) - 1 ) / 3 ) + 1 )
이것은 각 분기의 날짜와 날짜를 얻는 방법을 찾는 사람에게 도움이 될 수 있습니다.
declare @sdate date = '2022-02-01'
, @edate date = '2023-12-31';
with dates_CTE (cDate) as (
select @sdate
Union ALL
select DATEADD(day, 1, cDate)
from dates_CTE
where cDate < @edate
)
select min( cDate) dateFrom,max(cDate) dateTo, min(DATEPART(QUARTER, cDate))q, min(YEAR(cDate)) qYear, CONCAT(YEAR(cDate),'-Q', DATEPART(QUARTER, cDate)) qName
from dates_CTE
group by DATEPART(QUARTER, cDate), YEAR(cDate)
option (maxrecursion 1000)
샘플 출력
시작 날짜 | 날짜 지정 날짜: | q | q년 | qName |
---|---|---|---|---|
2022-02-01 | 2022-03-31 | 1 | 2022 | 2022-1분기 |
2022-04-01 | 2022-06-30 | 2 | 2022 | 2022-2분기 |
2022-07-01 | 2022-09-30 | 3 | 2022 | 2022-3분기 |
2022-10-01 | 2022-12-31 | 4 | 2022 | 2022-4분기 |
2023-01-01 | 2023-03-31 | 1 | 2023 | 2023-1분기 |
2023-04-01 | 2023-06-30 | 2 | 2023 | 2023-2분기 |
2023-07-01 | 2023-09-30 | 3 | 2023 | 2023-3분기 |
2023-10-01 | 2023-12-31 | 4 | 2023 | 2023-4분기 |
다음을 시도합니다.
CONCAT(datepart(yyyy,DATE),'-', DATEPART(qq,DATE))
반환되는 항목:
yyyy-q
예:2017-3
위해서2017-07-11
언급URL : https://stackoverflow.com/questions/11141100/how-to-get-calendar-quarter-from-a-date-in-tsql
'programing' 카테고리의 다른 글
"실행 중인 스크립트가 이 시스템에서 비활성화됨"을 수정하는 방법은 무엇입니까? (0) | 2023.09.01 |
---|---|
중첩된 사전 및 목록에서 키의 모든 항목 찾기 (0) | 2023.09.01 |
jQuery의 $.get()가 신뢰할 수 없는 URL에서 호출해도 안전합니까? (0) | 2023.09.01 |
산점도:오른쪽의 lib-axis (0) | 2023.09.01 |
Angular 4에서 모듈 'typescript'를 찾을 수 없음을 해결하는 방법은 무엇입니까? (0) | 2023.09.01 |