51

列に異なる日付があります。例えば:

20080102
20070821

これらの日付を年と暦四半期に変換したいと思います。例えば、

Year      Quarter
2008      2008-Q1
2007      2007-Q3

最初の列は次の方法で取得できます。

select left(date,4) as year from table 

2 番目の列を作成するにはどうすればよいですか?

4

17 に答える 17

116
SELECT DATEPART(QUARTER, @date)

これは、 が である@dateと仮定して、 の 4 分の 1 を返します。@dateDATETIME

于 2013-08-15T17:19:41.503 に答える
12
SELECT DATENAME(Quarter, CAST(CONVERT(VARCHAR(8), datecolumn) AS DATETIME))
于 2012-06-21T15:07:42.287 に答える
9

これが私のやり方です。非常に簡潔で、一時テーブルに依存しません。

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

明らかに、文字列自体は独自の形式に合わせて変更できます。これが役に立てば幸いです。

于 2013-07-10T15:53:18.263 に答える
3

ここに別のオプションがあります。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

SQL フィドル

int の列タイプの処理 (2014 年 4 月 23 日):

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;
于 2013-07-17T17:44:56.907 に答える
2

日付フィールド データが含まれ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ことです。そうすれば、これらの変換を実行する必要はありません。

于 2012-06-21T16:20:32.380 に答える
1

CONVERTをいじくり回すいい言い訳。おそらくそれを行うためのよりきれいな方法:

ここでSQLfiddleのライブテスト

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
于 2012-06-22T07:23:05.483 に答える
1
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 でライブ デモを見る

于 2013-07-09T04:15:59.160 に答える
1

フィールドのデータ型が INT で、フィールド名が「mydate」であると仮定します。OPの質問では、文字列に変換されたときのINT日付値はISO日付リテラルです。

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

古いサーバー バージョンを使用している場合は、datetime を使用できます。

于 2013-08-20T11:25:50.767 に答える
0

これを試してみてください

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

sysdate日付型形式の独自の列名とdualテーブル名に置き換えます

于 2013-07-09T03:46:44.043 に答える
0

ここでは、より多くの選択肢の 1 つが表示されます。

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
于 2016-12-23T10:43:19.007 に答える