J'ai une date différente dans une colonne .Par exemple 20080102,20070821
Je veux convertir cette date en année et trimestre.
Below is the output:
Year Quarter
2008 2008-Q1
2007 2007-Q3
select left(date,4) as year from table
Comment puis-je obtenir les détails de niveau trimestre.
SELECT DATEPART(QUARTER, @date)
Ceci renvoie le quart du @date
, en supposant que @date
est une DATETIME
.
SELECT DATENAME(Quarter, CAST(CONVERT(VARCHAR(8), datecolumn) AS DATETIME))
Voici une autre option. Utilisez un CTE pour définir les mois du trimestre, puis rejoignez-le pour déterminer le trimestre:
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;
Résultats:
Year Quarter
----- ----------
2008 2008-Q1
2007 2007-Q3
Poignée type 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;
Voici comment je le fais. Assez bref et ne repose pas sur des tables de temp.
CAST(year(TheDate) AS char(4)) + '-Q' +
CAST(CEILING(CAST(month(TheDate) AS decimal(9,2)) / 3) AS char(1))
Par exemple:
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
Cela retournera:
TheDate SelectQuarter
---------- -------------
07/10/2013 2013-Q3
Évidemment, la chaîne elle-même peut être modifiée pour correspondre à votre propre format. J'espère que c'est utile.
Puisque vos données de champ de date sont dans int
, vous devrez le convertir en date/heure:
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
ou
SELECT Datename(quarter, Cast(left(@date, 4) + '-'
+ substring(cast(@date as char(8)), 5, 2) + '-'
+ right(@date, 2) as datetime)) as quarter
Ensuite, si vous souhaitez ajouter le 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
Mon conseil serait de stocker vos données date
sous la forme datetime
afin que vous n'ayez pas à effectuer ces conversions.
Pour obtenir le résultat exact que vous avez demandé, vous pouvez utiliser les éléments ci-dessous:
CAST(DATEPART(YEAR, @Date) AS NVARCHAR(10)) + ' - Q' + CAST(DATEPART(QUARTER, @Date) AS NVARCHAR(10))
Cela vous donnera des sorties comme: "2015 - Q1", "2013 - Q3", etc.
En supposant que le type de données de champ INT et le nom de champ "mydate" . Dans la question OP, les valeurs de date INT converties en chaîne sont des littéraux de date ISO.
select DatePart(QUARTER, cast(cast(mydate as char(8)) as date))
Vous pouvez utiliser datetime si vous utilisez une version de serveur plus ancienne.
Belle excuse pour s'amuser avec CONVERT. Des façons probablement plus jolies de le faire:
test en direct sur SQLfiddle ici
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])
;
Vous devez convertir l'entier en char (8), puis en date/heure. puis envelopper cela dans SELECT DATEPART (QUARTER, [date])
Vous devrez ensuite convertir ce qui précède en personnage et ajouter le '-' + année (également converti en caractère).
Le dépassement arithmétique ci-dessus est provoqué par l'omission de la conversion initiale en un type de caractère.
Je serais enclin à abstraire la conversion en date-heure en utilisant des vues si possible, puis à utiliser la fonction de quart et la conversion de caractères selon les besoins.
Ici, vous voyez l'une des solutions les plus alternatives:
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
Essaye celui-là
SELECT CONCAT (TO_CHAR(sysdate,'YYYY-'),concat ('Q',TO_CHAR(sysdate,'Q') ))from dual
Remplacez sysdate
par votre propre nom de colonne par le format de type de date et dual
par votre nom de table
Je l'ai fait comme ça (j'utilise SQL Server):
SELECT 'Q' + cast(DATEPART(QUARTER, GETDATE()) as varchar(1)) + ' - ' + cast(DATEPART(YEAR, GETDATE()) as varchar(4)) AS 'Date Quarter'