【问题标题】:How to create customized quarter based on a given date column sql sql server如何根据给定的日期列创建自定义季度sql sql server
【发布时间】:2020-05-16 21:17:03
【问题描述】:

我正在使用 Microsoft sql 服务器。我想根据给定的日期列创建一个自定义的季度列。此日期列表示该特定年份季度的第一天。困难在于我的日期栏的时间跨度为 3 年。每年都有不同的季度开始日期。下面是我的日期列的示例。非常感谢!

Date
2011-02-28 00:00:00:000            ---first date of q1 in 2011
2011-05-31 00:00:00:000            ---first date of q2 in 2011
2011-08-31 00:00:00:000            ---first date of q3 in 2011
2011-12-01 00:00:00:000            ---first date of q4 in 2011
2012-02-29 00:00:00:000            ---first date of q1 in 2012
2012-05-30 00:00:00:000            ---first date of q2 in 2012
2012-08-30 00:00:00:000            ---first date of q3 in 2012
2012-11-30 00:00:00:000            ---first date of q4 in 2012
2013-02-28 00:00:00:000            ---first date of q1 in 2013
2013-05-30 00:00:00:000            ---first date of q2 in 2013
2013-08-30 00:00:00:000            ---first date of q3 in 2013
2013-11-30 00:00:00:000            ---first date of q4 in 2013

预期的结果是:

Date                               QuarterColumn
2011-02-28 00:00:00:000            q1
2011-05-31 00:00:00:000            q2
2011-08-31 00:00:00:000            q3
2011-12-01 00:00:00:000            q4
2012-02-29 00:00:00:000            q1
2012-05-30 00:00:00:000            q2
2012-08-30 00:00:00:000            q3
2012-11-30 00:00:00:000            q4
2013-02-28 00:00:00:000            q1
2013-05-30 00:00:00:000            q2
2013-08-30 00:00:00:000            q3
2013-11-30 00:00:00:000            q4

【问题讨论】:

  • 您的预期结果是什么?
  • MySQL 还是 SQL Server?
  • 嗯 - 2011Q1 的第一天是二月的最后一天?虽然我不认为有任何关于财政年度的法律规定(让我们准确了解您所说的日历的含义),但我从未见过任何一个月的最后一天开始的季度。
  • sql 服务器。就预期结果而言,请参阅我的更新。谢谢
  • 是的,这是我的数据和季度要求。需要忘记日历/通用季度规则。

标签: sql sql-server date datetime


【解决方案1】:

你需要创建查找表

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=816974201a48ed0bdf6782c121e1f8db

然后您将使用此表并将其加入到使用 between (start_q end_q) 以获得您的自定义季度。

【讨论】:

  • 那些开始日期将匹配两个季度,例如2011-05-31 返回 Q1 和 Q2。最后一行没有end_q,因此在该季度的日期之间将失败。
  • @dnoeth 是对的。我认为这是他应该纠正每个季度的开始和结束以获得预期结果的逻辑错误。
  • 不,您应该更改查询中的逻辑,减少 LEAD 返回的日期 :-)
  • @dnoeth 检查请dbfiddle.uk/…
【解决方案2】:

对于 SQL 服务器

CREATE TABLE datetable (
  [id] VARCHAR(11),
  [Date] datetime
);

INSERT INTO datetable
  ([id], [Date])
VALUES
  ('1', '2011-02-28 00:00:00:000'),
  ('2', '2011-05-31 00:00:00:000'),
  ('3', '2011-08-31 00:00:00:000'),
  ('4', '2011-12-01 00:00:00:000'),
  ('5', '2012-02-29 00:00:00:000'),
  ('6', '2012-05-30 00:00:00:000'),
  ('7', '2012-08-30 00:00:00:000'),
  ('8', '2012-11-30 00:00:00:000'),
  ('9', '2013-02-28 00:00:00:000'),
  ('10', '2013-05-30 00:00:00:000'),
  ('11','2013-08-30 00:00:00:000'),
  (12,'2013-11-30 00:00:00:000');
GO
12 行受影响
SELECT CONCAT('Q',DATEPART(quarter,[Date]), ' ',DATEPART(year,[Date]))
              FROM
              datetable
                                            ORDER BY [Date]
GO
| (无列名) | | :--------------- | | 2011 年第一季度 | | 2011 年第二季度 | | 2011年第三季度| | 2011年第四季度| | 2012 年第一季度 | | 2012 年第二季度 | | 2012年第三季度| | 2012年第四季度| | 2013 年第一季度 | | 2013 年第二季度 | | 2013年第三季度| | 2013年第四季度|

db小提琴here

对于mysql

架构 (MySQL v5.6)

CREATE TABLE datetable (
  `id` VARCHAR(11),
  `Date` datetime
);

INSERT INTO datetable
  (`id`, `Date`)
VALUES
  ('1', '2011-02-28 00:00:00:000'),
  ('2', '2011-05-31 00:00:00:000'),
  ('3', '2011-08-31 00:00:00:000'),
  ('4', '2011-12-01 00:00:00:000'),
  ('5', '2012-02-29 00:00:00:000'),
  ('6', '2012-05-30 00:00:00:000'),
  ('7', '2012-08-30 00:00:00:000'),
  ('8', '2012-11-30 00:00:00:000'),
  ('9', '2013-02-28 00:00:00:000'),
  ('10', '2013-05-30 00:00:00:000'),
  ('11','2013-08-30 00:00:00:000'),
  (12,'2013-11-30 00:00:00:000');

查询 #1

SELECT CONCAT('Q',QUARTER(`Date`), ' ',YEAR(`Date`))
FROM
  datetable
ORDER BY `Date`;

| CONCAT('Q',QUARTER(`Date`), ' ',YEAR(`Date`)) |
| --------------------------------------------- |
| Q1 2011                                       |
| Q2 2011                                       |
| Q3 2011                                       |
| Q4 2011                                       |
| Q1 2012                                       |
| Q2 2012                                       |
| Q3 2012                                       |
| Q4 2012                                       |
| Q1 2013                                       |
| Q2 2013                                       |
| Q3 2013                                       |
| Q4 2013                                       |

View on DB Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    相关资源
    最近更新 更多