web-dev-qa-db-ger.com

So erhalten Sie ein Quartal aus einem Datum in SQL

Ich habe ein anderes Datum in einer Spalte. Zum Beispiel 20080102,20070821

Ich möchte dieses Datum in Jahr und Quartal umrechnen.

Below is the output: 
Year       Quarter
2008      2008-Q1
2007      2007-Q3

select left(date,4) as year from table 

Wie bekomme ich die Details zum Quartal?.

34
David
SELECT DATEPART(QUARTER, @date)

Dies gibt das Viertel des @date zurück, vorausgesetzt @date ist eine DATETIME.

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

Hier ist eine weitere Option. Verwenden Sie einen CTE, um die Monate des Quartals zu definieren, und schließen Sie sich diesem an, um das Quartal zu bestimmen:

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;

Kehrt zurück:

Year  Quarter
----- ----------
2008  2008-Q1
2007  2007-Q3

SQL Fiddle

Behandeln Sie den Spaltentyp von int (23.04.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

So mache ich es. Ziemlich kurz und verlässt sich nicht auf Temp-Tabellen.

CAST(year(TheDate) AS char(4)) + '-Q' + 
CAST(CEILING(CAST(month(TheDate) AS decimal(9,2)) / 3) AS char(1))

Als Beispiel:

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 

Dies wird zurückkehren:

TheDate    SelectQuarter
---------- -------------
07/10/2013 2013-Q3

Natürlich kann die Zeichenfolge selbst an Ihr eigenes Format angepasst werden. Hoffe das ist hilfreich.

3
John Hamm

Da sich Ihre Datumsfelddaten in int befinden, müssen Sie sie in eine Datumszeit konvertieren:

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

oder

SELECT Datename(quarter, Cast(left(@date, 4) + '-' 
    + substring(cast(@date as char(8)), 5, 2) + '-' 
    + right(@date, 2) as datetime)) as quarter

Wenn Sie möchten, dass der Q1 hinzugefügt wird:

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

Mein Rat wäre, Ihre date-Daten als datetime zu speichern, damit Sie diese Konvertierungen nicht durchführen müssen. 

2
Taryn

Um genau die gewünschte Ausgabe zu erhalten, können Sie das Folgende verwenden:

CAST(DATEPART(YEAR, @Date) AS NVARCHAR(10)) + ' - Q' + CAST(DATEPART(QUARTER, @Date) AS NVARCHAR(10))

Dadurch erhalten Sie Ausgaben wie: "2015 - Q1", "2013 - Q3" usw.

1
TheHOOS

Angenommen, der Felddatentyp INT und der Feldname "mydate" . In der OP-Frage sind die INT-Datumswerte bei der Konvertierung in eine Zeichenfolge ISO-Datumsliterale.

select DatePart(QUARTER, cast(cast(mydate as char(8)) as date))

Sie können datetime verwenden, wenn Sie eine ältere Serverversion verwenden.

1
CFreitas

Schöne Entschuldigung, um mit CONVERT herumzuspielen. Wahrscheinlich hübschere Wege:

Live-Test auf SQLfiddle hier

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

Sehen Sie eine Live-Demo bei SQL Fiddle

1
ErikE

Sie müssen die Ganzzahl in ein Zeichen (8) und dann eine Datumszeit konvertieren. dann umhüllen in SELECT DATEPART (QUARTER, [Datum])

Sie müssen dann das obige Zeichen in Zeichen umwandeln und das Jahr "-" + hinzufügen (auch in Zeichen konvertiert). 

Der oben genannte arithmetische Überlauf wird durch das Weglassen der anfänglichen Konvertierung in einen Zeichentyp verursacht. 

Ich wäre geneigt, die Konvertierung in Datum-Zeit-Versionen möglichst mit Ansichten zu abstrahieren und dann nach Bedarf die Viertel-Funktion und die Zeichen-Konvertierung zu verwenden. 

0
David Boyle

Hier sehen Sie eine der weiteren Alternativen:

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

Probier diese 

SELECT  CONCAT (TO_CHAR(sysdate,'YYYY-'),concat ('Q',TO_CHAR(sysdate,'Q') ))from dual

Ersetzen Sie sysdate durch Ihren eigenen Spaltennamen durch Datumstypformat und dual durch Ihren Tabellennamen 

0

Ich habe es so gemacht (ich benutze 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