Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/08/2011, 17h41   #1
Invité de passage
 
Homme Eric
Développeur décisionnel
Inscription : juillet 2010
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Eric
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur décisionnel

Informations forums :
Inscription : juillet 2010
Messages : 3
Points : 0
Points : 0
Par défaut Problème de récupération de date

Bonjour a tous,

J'ai une requête SQL qui me permet de récupérer des informations dans une base de données AS400 et de les intégrer dans une table temporaire que je créer mais j'ai un petit soucis avec les dates.
En effet sur AS400 les dates ont le format suivant CYYMMDD (C pour century, Y pour year, M pour month et D pour day) et le format est txt. J'ai donc besoin de les convertir au format datetime.
J'utilise donc cette formule qui fonctionne bien : DATEDIFF(day, GETDATE(), cast(''20'' +left(right(T01.pdue15, 6), 2)+''-''+left(right(T01.pdue15, 4), 2)+''-''+right(T01.pdue15, 2) as datetime))

Mon problème est le suivant. Dans la base de donnée AS400 j'ai quelques enregistrements ou la date est a 0 et bien sur ça fait planter ma formule donc ma requête et je ne trouve pas comment gérer ce problème. J'ai essayer de ne pas prendre les enregistrements ou la date (PDUE15) est a 0 mais ça ne fonctionne pas ou de remplacer le 0 par une date "bidon" mais je n'y arrive pas non plus.

Merci beaucoup pour votre aide

Voici un extrait de ma requête qui devrait être suffisant pour comprendre.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171

DECLARE 
@Qsql_str varchar (max), -- Query String
@Rsql_str varchar (max), -- Result String
@RUNID varchar(max) ,
@vPDTo varchar(6),
@EXTRAS varchar(max),
@EXTRAS2 varchar(max),
@EXTRAS3 varchar(max),
@EXTRAS4 varchar(max),
@EXTRAS5 varchar(max),
@retval int

set @RUNID= global.gf_sys_RUNID()
SET @EXTRAS=' '
SET @EXTRAS2=' '
SET @EXTRAS3=' '
SET @EXTRAS4=' '
SET @EXTRAS5=' '
SET @vPDto= @pPeriodTo -190000

/* Create Temp file **********************************/
SET @Qsql_str=' CREATE TABLE [_temp_AGING_'+@RUNID+'](
	[TMP_CUSN] [varchar](8) NULL,
	[TMP_CNAM] [varchar](35) NULL,
	[TMP_OCAT] [varchar] (1) NULL,
	[TMP_INVN] [varchar] (8) NULL,	
	[TMP_INVD] [varchar] (7) NULL,
	[TMP_DUED] [varchar] (7) NULL,
	[TMP_SEGM] [varchar] (3) NULL,
	[TMP_SEGM_NAME] [varchar] (30) NULL,
	[TMP_BRANCH] [varchar] (5) NULL,
	[TMP_BRANCH_NAME] [varchar] (35) NULL,
	[TMP_SLMAN] [varchar] (5) NULL,
	[TMP_BBAL0] [numeric](38, 2) NULL,
	[TMP_BBAL10] [numeric](38, 2) NULL,
	[TMP_BBAL11] [numeric](38, 2) NULL,
	[TMP_BBAL2] [numeric](38, 2) NULL,
	[TMP_BBAL3] [numeric](38, 2) NULL,
	[TMP_BBAL4] [numeric](38, 2) NULL,
	[TMP_BBAL5] [numeric](38, 2) NULL,
	[TMP_BBAL6] [numeric](38, 2) NULL,
	[TMP_SLS_NAME] [varchar] (35) NULL,
	[TMP_CCLS] [varchar] (2) NULL,
	[TMP_CCLS_DESC] [varchar] (30) NULL,
	[TMP_DSEQ] [varchar] (3) NULL,
	[TMP_CGP205] [varchar] (3) NULL
	) ON [PRIMARY]'

EXEC (@Qsql_str)
/*******************************************************/

if @pBRANCH<>'<ALL>' AND @pBRANCH IS NOT NULL 
	SET @EXTRAS=@EXTRAS+' AND SLMN05 in ('+global.gf_MVParamsString(@pBRANCH)+')'

if @pSEGMENT<>'<ALL>' AND @pSEGMENT IS NOT NULL 
	SET @EXTRAS2=@EXTRAS2+' AND CGP105 in ('+global.gf_MVParamsString(@pSEGMENT)+')'
	
if @pCGP205<>'<ALL>' AND @pCGP205 IS NOT NULL 
	SET @EXTRAS3=@EXTRAS3+' AND CGP205 in ('+global.gf_MVParamsString(@pCGP205)+')'	
	
if @pSalesman<>'<ALL>' AND @pSalesman IS NOT NULL 
	SET @EXTRAS4=@EXTRAS4+' AND SLMN65 in ('+global.gf_MVParamsString(@pSalesman)+')'	
	
if @pSalesman<>'<ALL>' AND @pSalesman IS NOT NULL 
	SET @EXTRAS5=@EXTRAS5+' AND PJMG55 in ('+global.gf_MVParamsString(@pSalesman)+')'	


/************Load AGING ************************/

SET @Qsql_str = 'SELECT 
T01.CUSN15 as [TMP_CUSN], 
T02.CNAM05 as [TMP_CNAM], 
isnull(T01.OCAT15, 0) as [TMP_OCAT], 
T01.LREF15 as [TMP_INVN],
T01.DOCD15 as [TMP_INVD],
case
when T01.PDUE15 = ''0'' THEN ''0000000''
else T01.PDUE15 end as [TMP_DUED], 
T02.CGP105 as [TMP_SEGM],
T06.DESC60 as [TMP_SEGM_NAME],
T02.SLMN05 as [TMP_BRANCH],
T07.BNAM10 as [TMP_BRANCH_NAME],
T04.SLMN65 as [TMP_SLMAN],
case 
when OCAT15 NOT BETWEEN ''1'' AND ''6'' THEN BBAL15
else 
0 end as [TMP_BBAL0],
case 
when T01.OCAT15 = ''1'' AND DATEDIFF(day, GETDATE(), cast(''20'' +left(right(T01.pdue15, 6), 2)+''-''+left(right(T01.pdue15, 4), 2)+''-''+right(T01.pdue15, 2) as datetime)) > -6 THEN T01.BBAL15
else 
0 end as [TMP_BBAL10],
case 
when T01.OCAT15 = ''1'' AND DATEDIFF(day, GETDATE(), cast(''20'' +left(right(T01.pdue15, 6), 2)+''-''+left(right(T01.pdue15, 4), 2)+''-''+right(T01.pdue15, 2) as datetime)) < -5 THEN T01.BBAL15
else 
0 end as [TMP_BBAL11],
case 
when T01.OCAT15 = ''2'' THEN T01.BBAL15
else 
0 end as [TMP_BBAL2],
case 
when T01.OCAT15 = ''3'' THEN T01.BBAL15
else 
0 end as [TMP_BBAL3],
case 
when T01.OCAT15 = ''4'' THEN T01.BBAL15
else 
0 end as [TMP_BBAL4],
case 
when T01.OCAT15 = ''5'' THEN T01.BBAL15
else 
0 end as [TMP_BBAL5],
case 
when T01.OCAT15 = ''6'' THEN T01.BBAL15
else 
0 end as [TMP_BBAL6],
T05.PRMD15 as [TMP_SLS_NAME],
T03.CCLS20 as [TMP_CCLS],
T08.PRMD15 as [TMP_CCLS_DESC],
T01.DSEQ15 as [TMP_DSEQ],
T02.CGP205 as [TMP_CGP205]
FROM '+@vLIBRARYT1F2+'SLP15 T01

INNER JOIN '+@vLIBRARYT1F2+'SLP05 T02 on
T01.CONO15 = T02.CONO05
AND T01.CUSN15 = T02.CUSN05
AND T01.DSEQ15 = T02.DSEQ05

INNER JOIN '+@vLIBRARYT2F2+'OEP20 T03 on
T01.CONO15 = T03.CONO20
AND T01.CUSN15 = T03.CUSN20
AND T01.DSEQ15 = T03.DSEQ20

INNER JOIN '+@vLIBRARYT2F2+'OEP65 T04 on
T01.CONO15 = T04.CONO65
AND T01.LREF15 = T04.INVN65

LEFT OUTER JOIN '+@vLIBRARYT2F2+'INP15 T05 on
T05.CONO15 = T01.CONO15
AND T05.PSAR15 = T04.SLMN65
AND T05.PRMT15 = ''TN''

LEFT OUTER JOIN '+@vLIBRARYT1F2+'FLP060 T06 on
T06.CONO60 = T01.CONO15
AND T06.PMCD60 = T02.CGP105
AND T06.PMTP60 = ''CGP1''

LEFT OUTER JOIN '+@vLIBRARYT2F2+'EQP10  T07 on
T07.CONO10 = T01.CONO15
AND T07.BRSV10 = T02.SLMN05

LEFT OUTER JOIN '+@vLIBRARYT2F2+'INP15 T08 on
T08.CONO15 = T01.CONO15
AND T08.PSAR15 = T03.CCLS20
AND T08.PRMT15 = ''CCCC''

WHERE T01.CONO15=''' +@pCOMPANY + '''  

AND T01.BBAL15<>''0'' 
AND T01.ETYP15<>''UC''
AND LEFT(T01.PDUE15, 5) <= ' +@vPDTo + '
'+@EXTRAS +'
'+@EXTRAS2 +'
'+@EXTRAS3 +'
'+@EXTRAS4 +'
ORDER BY [TMP_CUSN]'

PRINT @Rsql_str
SET @Rsql_str = 'insert into _temp_AGING_'+@RUNID+' SELECT * FROM OPENQUERY('+@pINSTANCE+', ''' + REPLACE(@Qsql_str, '''', '''''') + ''') q '
PRINT @Rsql_str
EXEC(@Rsql_str)

Merci encore.

Zebulo80
zebulo80 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2011, 13h13   #2
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Pour remplacer par une date bidon, vous pouvez utiliser un CASE vu que vous connaissez votre regle applicative ...

Code :
1
2
3
4
5
6
7
8
9
10
11
 
...
DATEDIFF(day, GETDATE(), 
	CASE 
		WHEN T01.pdue15 = 0 
		THEN 
			GETDATE() /* Ou date bidon */
		ELSE
			cast(''20'' +LEFT(RIGHT(T01.pdue15, 6), 2)+''-''+LEFT(RIGHT(T01.pdue15, 4), 2)+''-''+RIGHT(T01.pdue15, 2) AS datetime) END 
)
...
Non ?

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 11h14   #3
Membre éclairé
 
Avatar de juvamine
 
Développeur informatique
Inscription : mai 2004
Messages : 394
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2004
Messages : 394
Points : 377
Points : 377
De mémoire sous DB2/AS400, quand on voit une date à 0 c'est qu'elle est nulle
essaie un
Code :
WHERE MaDate IS NOT NULL
A+
juva
__________________
http://chat.developpez.com/ -- Salon Base de Données --
juvamine est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h31.


 
 
 
 
Partenaires

Hébergement Web