web-dev-qa-db-fra.com

Comment obtenir le quart d'une date en SQL

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.

34
David
SELECT DATEPART(QUARTER, @date)

Ceci renvoie le quart du @date, en supposant que @date est une DATETIME.

76
DLeh
SELECT DATENAME(Quarter, CAST(CONVERT(VARCHAR(8), datecolumn) AS DATETIME))
12
Stuart Ainsworth

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

SQL Fiddle

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;
3
jiverson

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.

3
John Hamm

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. 

2
Taryn

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.

1
TheHOOS

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.

1
CFreitas

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
1
whytheq
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])
;

Voir une démonstration en direct chez SQL Fiddle

1
ErikE

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. 

0
David Boyle

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
0
Krunal Panchal

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 

0
Erichlong Mezque

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'
0
César León