【问题标题】:Extracting Dates based on Months根据月份提取日期
【发布时间】:2020-07-31 07:31:08
【问题描述】:

我在 MSSQL 数据库中有一张表,列出了学生开始课程的时间。学年从八月持续到七月。

学生从 2019 年 9 月 1 日开始的地方 我想表明他们从 19/20 开始 如果他们从 2020 年 5 月 6 日开始我想显示他们从 2020 年 19 月开始 如果他们从 2020 年 8 月 5 日开始我想显示他们从 20/21 开始

我已尝试将此作为案例陈述

SELECT 
   LEARNERID
  ,(
    CASE 
      WHEN datepart(MM, LEARNSTARTDATE) BETWEEN 8 AND 12
        THEN datepart(YY, LEARNSTARTDATE)
      END
    ) AS StartYear
  ,(
    CASE 
      WHEN datepart(MM, LEARNSTARTDATE) BETWEEN 1 AND 7
        THEN datepart(YY, LEARNSTARTDATE)
      END
    ) AS EndYear
FROM ILR

这对我不起作用

对此的任何帮助将不胜感激。谢谢

【问题讨论】:

标签: sql sql-server tsql date select


【解决方案1】:

我会将日期偏移 6 个月,并将其格式化如下:

format(dateadd(month, -6, learnstartdate), 'yy')
    + '/'
    + format(dateadd(month, 6, learnstartdate), 'yy')

Demo on DB Fiddle

select  
    learnstartdate, 
    format(dateadd(month, -6, learnstartdate), 'yy')
        + '/'
        + format(dateadd(month, 6, learnstartdate), 'yy') scholar_year
from (values('2019-09-01'), ('2020-05-06'), ('2020-08-05')) t(learnstartdate)
GO
学习开始日期 |学者年 :------------- | :----------- 2019-09-01 | 19/20 2020-05-06 | 19/20 2020-08-05 | 20/21

【讨论】:

  • 感谢您的帮助
【解决方案2】:

一个选项是CASE...ELSEMODULO (%) 用于获取两位数年份,CONCAT 用于处理数据类型到字符串的转换。

SELECT 
   LEARNERID
  ,LEARNSTARTDATE
  ,CASE 
      WHEN datepart(MONTH, LEARNSTARTDATE) >= 8
        THEN CONCAT(datepart(YEAR, LEARNSTARTDATE) % 100 , '/', datepart(YEAR, LEARNSTARTDATE) % 100 + 1)
      ELSE CONCAT(datepart(YEAR, LEARNSTARTDATE) % 100 -1 , '/', datepart(YEAR, LEARNSTARTDATE) % 100)
    END AS RequestedOutput
FROM 
(
   VALUES (1,'2019-09-01'),(2,'2020-05-06'),(3,'2020-08-20')
) v(LEARNERID,LEARNSTARTDATE);

结果:

+-----------+----------------+-----------------+
| LEARNERID | LEARNSTARTDATE | RequestedOutput |
+-----------+----------------+-----------------+
|         1 | 2019-09-01     | 19/20           |
|         2 | 2020-05-06     | 19/20           |
|         3 | 2020-08-20     | 20/21           |
+-----------+----------------+-----------------+

Rextester Demo

【讨论】:

  • 谢谢 Eric - 我现在被宠坏了。
【解决方案3】:

您可以通过在日期上加上 5 个月来获得EndYear

select LEARNERID, LEARNSTARTDATE, EndYear - 1 StartYear, EndYear
from (
  select LEARNERID, LEARNSTARTDATE, year(dateadd(month, 5, LEARNSTARTDATE)) EndYear
  from ILR  
) t  

如果你想要XX/XX格式的结果:

select LEARNERID, LEARNSTARTDATE,
  format((EndYear - 1) % 100, '00') + '/' + format((EndYear) % 100, '00') AcademicYear
from (
  select LEARNERID, LEARNSTARTDATE, year(dateadd(month, 5, LEARNSTARTDATE)) EndYear
  from ILR  
) t 

请参阅demo
结果:

> LEARNERID | LEARNSTARTDATE | AcademicYear
> --------: | :------------- | :-----------
>         1 | 2019-09-01     | 19/20       
>         2 | 2020-05-06     | 19/20       
>         3 | 2020-08-05     | 20/21       
>         4 | 2019-08-01     | 19/20       
>         5 | 2019-07-31     | 18/19    

【讨论】:

  • @gillers322 似乎您接受了 3 个现有错误的唯一答案,如您在此处看到的:dbfiddle.uk/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
相关资源
最近更新 更多