【问题标题】:t-sql assign dates to academic yeart-sql 为学年分配日期
【发布时间】: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 服务器中是否有一种简单的方法可以做到这一点。

【问题讨论】:

    标签: sql


    【解决方案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
            

            【讨论】:

              猜你喜欢
              • 2016-02-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-02-15
              • 1970-01-01
              • 2012-05-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多