将日期范围列转换为月份

7kqas0il  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(430)

我有table call students,它有三个列id,datefrom,dateto现在我想把两个dates列范围datefrom和dateto转换成一个列months作为输出。
表格结构如下。日期格式(yyyy-mm-dd)

  1. ID DateFrom DateTo
  2. 123 2019-12-03 2020-02-03
  3. 456 2020-02-03 2020-02-21

产出结构

  1. ID Months
  2. 123 2019-12
  3. 123 2020-01
  4. 123 2020-02
  5. 456 2020-02
r6vfmomb

r6vfmomb1#

最简单的方法是使用一个辅助日历表,在两个表之间建立一个简单的连接:

  1. select distinct a.id, convert(char(7), b.[Date], 120) as month
  2. from yourTable as a
  3. join Calendar as b
  4. on a.DateFrom <= b.[Date]
  5. and a.DateTo >= b.[Date]
  6. ;

如果没有日历表,可能需要考虑添加一个日历表。
如果不能(或不想)添加日历表,可以使用数字(tally)表获得相同的结果。
如果没有计数表,可以使用公共表表达式动态生成一个。
在这种情况下,sql是这样的:

  1. WITH N10 AS
  2. (
  3. SELECT n
  4. FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9))V(n)
  5. ), Tally AS
  6. (
  7. SELECT TOP (SELECT MAX(DATEDIFF(MONTH, DateFrom, DateTo)) + 1 FROM yourTable) ROW_NUMBER() OVER(ORDER BY @@SPID) -1 As n
  8. FROM N10 As Ten
  9. CROSS JOIN N10 As Hundred
  10. --CROSS JOIN N10 As Thousand
  11. )
  12. SELECT [ID], CONVERT(char(7), Months, 120) As Months
  13. FROM yourTable
  14. CROSS APPLY
  15. (
  16. SELECT N, DATEADD(MONTH, N, [DateFrom]) As Months
  17. FROM Tally
  18. ) X
  19. WHERE Months <= EOMONTH([DateTo])
  20. ORDER BY Id, Months
展开查看全部
sxpgvts3

sxpgvts32#

假设您的表名为“dataval”,请尝试以下操作

  1. ;WITH minmax AS (
  2. SELECT Min(Eomonth(datefrom)) AS MinDate,
  3. Max(Eomonth(dateto)) AS MaxDate
  4. FROM dataval),
  5. months (date) AS (
  6. SELECT mindate
  7. FROM minmax
  8. UNION ALL
  9. SELECT Dateadd(month, 1, date)
  10. FROM months
  11. WHERE Dateadd(month, 1, date) <= (SELECT maxdate FROM minmax))
  12. SELECT ID, FORMAT (date, 'yyyy-MM') Months
  13. FROM dataval
  14. INNER JOIN months
  15. ON months.date BETWEEN Eomonth(dataval.datefrom) AND Eomonth(dataval.dateto)

在这里摆弄

展开查看全部

相关问题