2009-02-05 5 views
2

J'essaie d'attribuer des dates d'absence à une année scolaire, l'année scolaire étant du 1er août au 31 juillet.t-sql attribuer des dates à l'année scolaire

donc ce que je veux serait:
31/07/2007 = 2006/2007
02/10/2007 = 2007/2008
08/01/2008 = 2007/2008

Y at-il un moyen facile de le faire dans le serveur SQL 2000.

Répondre

6

Une variante avec moins de manutention chaîne

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 

Résultat:

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

devrait fonctionner de cette façon:

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 

Exemple:

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 
1

Vous pouvez créer une fonction comme suit:

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 

Et alors appeler avec:

SELECT dbo.GetAcademicYear('31 July 2007') 

ou

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

etc

1

Peut-être que vous pourriez envisager de créer une table AcademicYear, quelque chose comme ceci:

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

et de la remplir en conséquence. Ensuite, votre requête pourrait devenir

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

En avantages sociaux, si le début et la fin de l'année devrait changer, il est un changement de données, pas une UDF étendue horrible.

1

Je suggère de créer une table de calendrier. Il comprend toutes les dates pour le futur prévisible (et passé) avec toutes les informations pour les dates dont vous avez besoin - comme l'année scolaire à laquelle il appartient. Vous pouvez également ajouter des choses comme si c'est un jour férié, un week-end, etc.

Chaque fois que vous avez besoin de n'importe quel type de requête, il suffit de joindre à votre table de calendrier.

Questions connexes