创建新列以存储现有日期时间列中的四分之一年份

时间:2016-09-08 11:05:09

标签: sql sql-server

我的表格有日期时间列:DateOfDisc

我需要编写一个查询,创建动态新列,以该格式显示DateOfDisc的四分之一:“Q1”,“Q2”,“Q3”,“Q4”,因此:

  

如果Month(DateOfDisc)为1或2或3,则值为Q1
如果   月(DateOfDisc)是4或5或6,值将是Q2
如果   月份(DateOfDisc)是7或8或9,值将是Q3
如果   月份(DateOfDisc)是10或11或12,而值将是Q4

我怎样才能做到这一点?

7 个答案:

答案 0 :(得分:3)

您的定义是quarter的标准定义,因此最简单的方法是使用datename(),因为这会返回一个不是数字的字符串:

SELECT 'Q' + DATENAME(QUARTER, DateOfDisc) as Quarter

如果需要,可以将其设为计算列,以便任何使用该表的人都可以使用

ALTER TABLE t ADD Quarter as ('Q' + DATENAME(QUARTER, DateOfDisc));

答案 1 :(得分:2)

您可以直接使用带有季度选项的DATEPART()功能来获取日期所属的季度

SELECT *, 'Q' + CAST(DATEPART(QUARTER, DateOfDisc) AS VARCHAR(1)) as Quarter
FROM TableName

答案 2 :(得分:2)

你也可以试试这个:

 PrintWriter out = resp.getWriter();
                resp.setContentType("text/html");
                req.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, print);
                exporter = new HtmlExporter();

                SimpleHtmlReportConfiguration configuration = new SimpleHtmlReportConfiguration();
                configuration.setWrapBreakWord(true);
                exporter.setConfiguration(configuration);

                exporter.setExporterInput(new SimpleExporterInput(print));
                SimpleHtmlExporterOutput output = new SimpleHtmlExporterOutput(out);
                String[] uriParts = req.getRequestURI().split("/");
                output.setImageHandler(new WebHtmlResourceHandler("/" + uriParts[1] + "/image?image={0}"));
                exporter.setExporterOutput(output);
                exporter.exportReport();

答案 3 :(得分:1)

添加计算列,以确保数据始终一致:

var color = worksheet.Cells[1,1,1,5].Style.Font.Color
    .LookupColor(worksheet.Cells[1,1,1,5].Style.Font.Color);

答案 4 :(得分:1)

您可以使用DATEPART。见例:

WITH Src AS
(
    SELECT DATEADD(MONTH, M, '2016-01-01') SomeDate
    FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11)) T(M)
)
SELECT SomeDate, 'Q'+CONVERT(varchar,DATEPART(QUARTER, SomeDate)) [Quarter]
FROM Src

它产生:

SomeDate                  Quarter
-----------------------   -------
2016-01-01 00:00:00.000   Q1
2016-02-01 00:00:00.000   Q1
2016-03-01 00:00:00.000   Q1
2016-04-01 00:00:00.000   Q2
2016-05-01 00:00:00.000   Q2
2016-06-01 00:00:00.000   Q2
2016-07-01 00:00:00.000   Q3
2016-08-01 00:00:00.000   Q3
2016-09-01 00:00:00.000   Q3
2016-10-01 00:00:00.000   Q4
2016-11-01 00:00:00.000   Q4
2016-12-01 00:00:00.000   Q4

答案 5 :(得分:1)

我会建议一个没有大小写的计算列,使用简单的除法。

alter table tablename add quarter as 'Q'||(2+Month(DateOfDisc))/3

如果你的关注是铸造:

alter table tablename add quarter as 'Q'||cast((2+Month(DateOfDisc))/3 as varchar(1))

答案 6 :(得分:0)

假设您具有此收入表,并且想要获得4个季度的收入部门

date       | revenue | division
-----------|---------|---------
2018-01-20 | 1500000 | chemo
2019-02-21 | 1200000 | agri
2019-04-09 | 390900  | pharma
CREATE TABLE revn 
(
  date  DATE,
  rev  INTEGER,
  division TEXT
);


INSERT INTO revn (date, rev, division)
VALUES
    ("2018-01-20", 1500000, "D1"),
    ("2019-02-21", 1200000, "d2"),
    ("2019-04-09", 390900, "d3")
    ("2019-04-09", 390900, "d4");

有一个名为QUARTER(col_name)please see the w3school docs的函数,在这种情况下将很方便,如下所示:

SELECT (
  SELECT QUARTER(date) 
) AS q, rev
FROM revn;

输出应为:

**[Results][2]**:

    | q |     rev |
    |---|---------|
    | 1 | 1500000 |
    | 1 | 1200000 |
    | 2 |  390900 |
    | 2 |  390900 |