t-sql 为学年分配日期

Posted

技术标签:

【中文标题】t-sql 为学年分配日期【英文标题】:t-sql assign dates to academic year 【发布时间】:2009-02-05 11:48:29 【问题描述】:

我正在尝试将缺勤日期分配给一个学年,该学年是 8 月 1 日至 7 月 31 日。

所以我想要的是: 31/07/2007 = 2006/2007 02/10/2007 = 2007/2008 08/01/2008 = 2007/2008

在 sql 2000 服务器中是否有一种简单的方法可以做到这一点。

【问题讨论】:

【参考方案1】:

字符串处理较少的变体

SELECT
  AbsenceDate,
  CASE WHEN MONTH(AbsenceDate) <= 7 
    THEN 
      CONVERT(VARCHAR(4), YEAR(AbsenceDate) - 1) + '/' + 
      CONVERT(VARCHAR(4), YEAR(AbsenceDate))
    ELSE 
      CONVERT(VARCHAR(4), YEAR(AbsenceDate)) + '/' + 
      CONVERT(VARCHAR(4), YEAR(AbsenceDate) + 1)
  END AcademicYear
FROM
  AbsenceTable

结果:

2007-07-31 => '2006/2007' 
2007-10-02 => '2007/2008' 
2008-01-08 => '2007/2008'

【讨论】:

【参考方案2】:

应该这样工作:

select case 
    when month(AbsenceDate) <= 7 then 
        ltrim(str(year(AbsenceDate) - 1)) + '/' 
               + ltrim(str(year(AbsenceDate)))
        else 
        ltrim(str(year(AbsenceDate))) + '/' 
               + ltrim(str(year(AbsenceDate) + 1))
        end

例子:

set dateformat ymd
declare @AbsenceDate datetime
set @AbsenceDate = '2008-03-01'
select case 
    when month(@AbsenceDate) <= 7 then 
        ltrim(str(year(@AbsenceDate) - 1)) + '/' 
               + ltrim(str(year(@AbsenceDate)))
        else 
        ltrim(str(year(@AbsenceDate))) + '/' 
               + ltrim(str(year(@AbsenceDate) + 1))
        end

【讨论】:

【参考方案3】:

也许您可以考虑创建一个 AcademicYear 表,如下所示:

CREATE TABLE AcademicYear (
    AcYear   VARCHAR(9)
,   FromDate DATE,
,   ToDate   DATE)

并相应地填充它。那么你的查询可能会变成

SELECT
  AbsenceDate,
  AcYear
FROM
  AbsenceTable JOIN AcademicYear ON AbsenceDate BETWEEN FromDate AND ToDate

作为一项附带福利,如果一年的开始和结束时间发生变化,那是数据变化,而不是可怕的扩展 UDF。

【讨论】:

【参考方案4】:

我建议创建一个日历表。它将包括可预见的未来(和过去)的所有日期以及您需要的这些日期的任何信息 - 例如它所属的学年。然后,您还可以添加诸如是否是假期、周末等内容。

当您需要任何类型的查询时,只需加入您的日历表即可。

【讨论】:

【参考方案5】:

您可以按如下方式创建函数:

CREATE FUNCTION dbo.GetAcademicYear(@in DATETIME)
RETURNS VARCHAR(10) AS
BEGIN
    DECLARE @out VARCHAR(10)

    IF (MONTH(@in) > 7)
        SET @out = CAST(YEAR(@in) AS VARCHAR) + '/' + CAST((YEAR(@in) + 1) AS VARCHAR)
    ELSE
        SET @out = CAST((YEAR(@in) - 1) AS VARCHAR) + '/' + CAST(YEAR(@in) AS VARCHAR)

    RETURN(@out)
END

然后只需调用它:

SELECT dbo.GetAcademicYear('31 July 2007')

SELECT col1, col2, dbo.GetAcademicYear(date_col) AS academic_year, col3, etc
FROM my_table

【讨论】:

以上是关于t-sql 为学年分配日期的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个新列来指定日期所属的年份范围(如学年)?

如何从 SQL (T-SQL) 中的日期组件创建日期?

在 T-SQL 中将以毫秒为单位的 Epoch 转换为日期

T-SQL - 将日期时间转换为未分隔的 ISO 值

T-SQL 查询以获取从今天起 +30 天的日期

从T-SQL中的周数中获取日期