【发布时间】:2021-07-27 08:20:45
【问题描述】:
我正在尝试创建一个包含以下列和要求的日历表。我之前制作了这个日历表,但我无法将其更新到我当前的要求。
- 日期
- 周号
- 周名称
- 周开始日期
- 周结束日期
- 月
- 月份开始日期
- 月结束日期
- 列表项
- 季度
- 季度开始日期
- 季度结束日期
- 年份
要求
- --星期从星期日开始到星期六结束
- --周名称格式应为 31Aug--to--06Sep
- --月份应该是周月的结束日期
- --日历应该从2015-08-31开始
- --财政年度应为 FY16-17 格式
- --年份应从 6 月 1 日至 5 月 31 日开始
- --季度应该是上述日期的 3 个月
- --Week No 应该是增量数字,不应在一年完成后重置。
查询
DECLARE @StartDate date = '20150831'
DECLARE @CutoffDate date = '20300101'
;WITH seq(n) AS
(
SELECT 0 UNION ALL SELECT n + 1 FROM seq
WHERE n < DATEDIFF(DAY, @StartDate, @CutoffDate)
),
d(d) AS
(
SELECT DATEADD(DAY, n, @StartDate) FROM seq
),
src AS /*SOURCE TABLE WITH OBJECT DEFINITION*/
(
SELECT
TheDate = CONVERT(date, d),
TheDay = DATEPART(DAY, d),
TheDayName = DATENAME(WEEKDAY, d),
TheWeek = DATEPART(WEEK, d),
TheDayOfWeek = DATEPART(WEEKDAY, d),
TheMonth = DATEPART(MONTH, d),
TheMonthName = DATENAME(MONTH, d),
TheQuarter = Concat('Q',DATEPART(Quarter, d)),
Financial_Year = DATEPART(YEAR, d),
Financial_Quarter=Datepart(QUARTER,d),
TheYear = DATEPART(YEAR, d),
TheFirstOfMonth = DATEFROMPARTS(YEAR(d), MONTH(d), 1),
TheFirstOfFYear = DATEFROMPARTS(YEAR(d), 4, 1),
TheFirstOfYear = DATEFROMPARTS(YEAR(d), 1, 1),
TheLastOfYear = DATEFROMPARTS(YEAR(d), 12, 31),
TheDayOfYear = DATEPART(DAYOFYEAR, d)
FROM d
),
Dimension AS
(
SELECT
TheDate,
TheDay,
TheDayName,
TheDayOfWeek,
-- TheDayOfWeekInMonth = CONVERT(tinyint, ROW_NUMBER() OVER
-- (PARTITION BY TheFirstOfMonth, TheDayOfWeek ORDER BY TheDate)),
TheDayOfYear,
TheWeek,
TheFirstOfWeek = DATEADD(DAY, 1 - TheDayOfWeek, TheDate),
TheLastOfWeek = DATEADD(DAY, 6, DATEADD(DAY, 1 - TheDayOfWeek, TheDate)),
TheMonth,
TheMonthName,
TheFirstOfMonth,
TheLastOfMonth = MAX(TheDate) OVER (PARTITION BY TheYear, TheMonth),
TheFirstOfNextMonth = DATEADD(MONTH, 1, TheFirstOfMonth),
TheLastOfNextMonth = DATEADD(DAY, -1, DATEADD(MONTH, 2, TheFirstOfMonth)),
TheQuarter,
TheFirstOfQuarter = MIN(TheDate) OVER (PARTITION BY TheYear, TheQuarter),
TheLastOfQuarter = MAX(TheDate) OVER (PARTITION BY TheYear, TheQuarter),
TheYear,
TheFirstOfYear = DATEFROMPARTS(TheYear, 1, 1),
TheFirstOfFYear = DATEFROMPARTS(TheYear, 4, 1),
TheLastOfYear,
MMYYYY = CONVERT(char(2), CONVERT(char(8), TheDate, 101))
+ CONVERT(char(4), TheYear),
Financial_Quarter = Datepart(Quarter,DATEADD(MONTH, -3, TheFirstOfMonth)), /*Starting Financial Quarter from April*/
Financial_Year =CASE
WHEN Financial_Quarter = 1 THEN DATEPART(Year,Dateadd(Year,-1,TheFirstofYear)) ELSE THEYEAR END
FROM src
)
SELECT * FROM Dimension
ORDER BY TheDate
OPTION (MAXRECURSION 0);
如何根据星期转换月份,例如一个月从星期日开始(星期也从星期日开始)日期为 01-MM-YYYY,并且该月应始终在星期六结束,通常一个月有 4 周。该月不能以前一周或前一个月的日期开始或结束,它应该始终只有整个星期,从星期日开始到星期六结束。
【问题讨论】:
-
您的问题是什么?
-
如何根据星期转换月份,例如一个月从星期日开始(星期也从星期日开始)日期为 01-MM-YYYY,并且该月应始终在星期六结束,通常为 4 周一个月。该月不能以前一周或前一个月的日期开始或结束,它应该始终只有整个星期,从星期日开始到星期六结束。希望你我能够正确传达味精
-
好像只需要数一下这个月的星期几;这给了你“周数”。如果是这样,这只是一个窗口累积
COUNT。 -
此外,此 SQL 看起来与此 question 中的 SQL 非常相似。老实说,我建议您也使用基于集合的方法来创建表格。
-
尽量提供最小的可行示例,这样会很容易上手。给出一个样本输入和预期输出
标签: sql sql-server tsql