0
votes

Comment puis-je convertir un entier comme 3212007 en date 3-21-2007 en utilisant IBM DB2 SQL?

Le jeu de données que j'ai hérité a une colonne de date, mais les valeurs de cette colonne sont des entiers du formulaire 3212007 qui devrait être 03-21-2007 . Je ne peux pas le récupérer au format de la date.

Je peux convertir l'entier en une chaîne à l'aide de Cast (myinteger comme Varchar (8)) sans difficulté. Ensuite, je peux CAST QUE JUSQU'À DATE PAR CAST (MYINTTEGER AS VARCHAR (8)) AS DATE) QUI Donne une date. Le problème est que mon entier est formaté comme 'mmddyyyy' alors pour 3212007 , je reçois 3212-01-07 . < Pré> xxx

Autres messages suggèrent à l'aide de la commande Convert , mais tout ce que je reçois sont des erreurs

"date" n'est pas valide dans le contexte où il est utilisé ... "

Pourriez-vous vous conseiller?


0 commentaires

3 Réponses :


0
votes

Ceci fonctionne (au moins dans MS SQL Server):

   SELECT CAST(CONCAT( RIGHT(3212007,4),'-',
       (3212007 / 1000000), '-', ((3212007 % 1000000) / 10000)) AS date)


2 commentaires

L'IBM's DB2 devrait également prendre en charge concat () et droite () fonctions afin que cette requête soit aussi ...


DB2 ne veut pas accepter Concat, je reçois l'erreur "Aucune routine autorisée nommée" Concat "de type" Fonction "Les arguments compatibles ont été trouvés." La réponse de Mark Barinstein ci-dessus a fait l'affaire. Merci pour votre contribution.



1
votes

Essayez ceci: xxx pré>

Si vous pouvez avoir un chiffre pendant un mois, il y a une alternative: p>

select 
date 
( 
  case when substr(char_dt, 1, 2)='00' 
    then translate('EFGH-0D-0C', char_dt, 'ABCDEFGH')
    else translate('EFGH-AB-CD', char_dt, 'ABCDEFGH')
  end
) dt, char_dt
from 
(
  select digits(dec(i, 8)) char_dt
  from table(values 3212007, 312007) t(i)
) t;

DT         CHAR_DT
---------- --------
2007-03-21 03212007
2007-01-03 00312007


2 commentaires

Merci beaucoup! Cela fonctionne comme un charme. Mon prochain ordre des affaires est de savoir qui a foiré les dates en premier lieu!


C'est bon d'entendre ça. Marquez la réponse comme acceptée alors, s'il vous plaît.



0
votes

Je pense que cela peut bien fonctionner:

create table #temp(
date int
)

insert into #temp (date)
values(3212007),
      (12032019) 

select 
case when len(cast(date as varchar)) = 7 
then 
'0' + left(cast(date as varchar), 1) + '-' + substring(cast(date as varchar), 2,2) + '-' + right(cast(date as varchar), 4)
else  left(cast(date as varchar), 2) + '-' + substring(cast(date as varchar), 3,2) + '-' + right(cast(date as varchar), 4) end
from #temp


0 commentaires