Problème curieux avec les dates
Bonjour
avec cette table
Code:
1 2 3 4 5 6 7 8 9
|
CREATE TABLE [dbo].[VPA_PLANNING](
[IDpla] [int] IDENTITY(100001,1) NOT NULL,
[dtpla] [smalldatetime] NULL,
[idcol] [int] NULL,
[idaff_mat] [int] NULL,
[idaff_apm] [int] NULL,
CONSTRAINT [PK_VPA_PLANNING] PRIMARY KEY CLUSTERED
) |
Je veux une procédure identifiant pour une date dtpla et un ID idcol si idaff_mat ou idaff_apm contient une valeur >0
(il peut y avoir NULL 0 ou une valeur >1000)
J'ai la procédure
Code:
1 2 3 4 5 6 7
|
dbo.spvpa_adm_planning_sijournoncomplet_test
@ladate smalldatetime,
@idcol int
AS
select * from vpa_planning
where (idaff_mat< 1000 or idaff_apm < 1000) and idcol=@idcol and dtpla=@ladate |
Mais bonjour les problèmes avec la date
Je teste avec l'interface management studio directement sur la table
et j'obtient la requête SQL:
avec comme date le 17 mars 2009 que je note 17/03/2009 et auquel il ajoutte les quotes ( ='17/03/2009')
Code:
1 2 3 4
|
SELECT IDpla, dtpla, idcol, idaff_mat, idaff_apm
FROM dbo.VPA_PLANNING
WHERE (idcol = 1009) AND (dtpla = CONVERT(DATETIME, '2009-03-17 00:00:00', 102)) |
avec le 10 mars noté à l'identique 10/03/2009
Code:
1 2 3 4
|
SELECT IDpla, dtpla, idcol, idaff_mat, idaff_apm
FROM dbo.VPA_PLANNING
WHERE (idcol = 1009) AND (dtpla = CONVERT(DATETIME, '2009-10-03 00:00:00', 102)) |
je suis passé en octobre !
J'ai essayé avec le type 103 au lieu du 102
j'ai mis l'expression = CONVERT (DATETIME, '2009-03-10 00:00:00', 103) directement dans le filtre de l'interface en face de dtpla
et j'obtient l'enregistrement du 3 octobre 2009
Idem avec le type 102
Et je ne parle pas des séries. Si je veux les enregistrements du 10/03/2009 au 19/03/2009 ça devient vraiment loufoque.
J'ai essayé de mettre
SET DATEFORMAT YMD
dans ma proceure stockée mais je ne dois pas bien m'y prendre car j'ai des erreurs de convertion
Je l'ai mis entre la ligne AS et la ligne Select de la procedure stockée
mais dois-je mettre un GO aprés ?
Comment être sur que les enregistrements que retourne la requête correspondent bien à ce que l'on a demandé si le système traite différemment les dates inférieures au 13 du mois des autres
Jusqu'à présent j'ai toujours travaillé avec les dates en les décomposant avec Year() Month() et day()mais je trouve ça un peu lourd et sans doute gourmant en ressources.
Y a t-il un article de référence sur ce théme, pour les dates et plages de dates transmises en paramètres à une procédure stockée?
Quel type est le mieux adapté, le datetime, le numérique en donnant la date en seconde ou le varchar en faisant un convert ?
Par avance merci pour vos pistes et information
Didier