2010-05-11 16 views
1

J'ai 2 champs entiers qui représentent des dates au format YYYYMMDD. Quelle est la meilleure façon de soustraire 2 de ces champs pour obtenir le bon nombre de jours entre eux? Par exemple, si je prends la différence entre 20100511 et 20100428, je voudrais que le résultat soit 13 et non 83. Je sais que je dois convertir les champs entiers en formats de date mais tout ce que j'ai essayé jette une exception ou ne fonctionne pas correctement.Comment soustraire des dates au format AAAAMMJJ?

Qu'est-ce qui me manque? Réponses dans vb.net s'il vous plaît

+0

Eww ... pourquoi sont-ils des champs entiers qui représentent efficacement les chaînes? – Noldorin

+0

@Noldorin: C'est un type plus efficace que la chaîne? –

+0

Bien DateTime est vraiment le plus approprié, et chaque système de DB que je connais prend en charge. Si vous allez utiliser un nombre entier, il vaut probablement mieux stocker le nombre de ticks ... – Noldorin

Répondre

8

Il devrait être quelque chose comme ça (non testé!)

Dim date1 As DateTime = DateTime.ParseExact(yourdate1.ToString(), "yyyyMMdd", CultureInfo.InvariantCulture) 
Dim date2 As DateTime = DateTime.ParseExact(yourdate2.ToString(), "yyyyMMdd", CultureInfo.InvariantCulture) 
Dim days As Integer = date1.Subtract(date2).Days 
+0

Je pense que vous avez besoin de 'yourdate.ToString()' pour le scénario de l'asker, mais sinon il a raison. :) – Noldorin

+0

Bon point. J'avais édité pour dire que votre date devait être une chaîne, mais ce n'est pas ce que l'affiche avait. –

+0

Vos chaînes de format sont erronées. 'mm' est les minutes et' YYYY' n'existe pas. –

2
Dim dt1 As Integer = 20100510 
    Dim dt2 As Integer = 20100520 
    Dim date1 As DateTime = DateTime.ParseExact(dt1.ToString(), "yyyyMMdd", CultureInfo.InvariantCulture) 
    Dim date2 As DateTime = DateTime.ParseExact(dt2.ToString(), "yyyyMMdd", CultureInfo.InvariantCulture) 
    Dim nDays As Integer = date1.Subtract(date2).Days 
+0

Cela ne mentionne pas du tout l'analyse requise. – Noldorin

+0

Fixé. Juste une note cependant, avant que vous downvote quelqu'un et disiez à une autre personne que votre réponse est «autrement correct», vous voudrez peut-être vous embêter à le confirmer vous-même. Il n'avait pas le paramètre CultureInfo (il l'a depuis corrigé) qui est requis pour ParseExact, donc vous vous êtes trompé. – dcp

+0

Oui, c'est pourquoi j'ai dit non testé. :) Vous avez fait la même erreur que j'ai faite avec le format de chaîne personnalisé (YYYYmmdd devrait être aaaaMMdj). Nous avions tous tort. –

4

Code Overkill ...

// C# 

var ds1 = 20100511; 
var ds2 = 20100428; 

Func<int, DateTime> getDate = s => DateTime.ParseExact(s.ToString(), 
                 "yyyyMMdd", 
                 null); 

var d1 = getDate(ds1); 
var d2 = getDate(ds2); 

var diff = d1.Subtract(d2); 
var result = diff.Days; //13 

...

//VB.Net 

Dim ds1 = 20100511 
Dim ds2 = 20100428 

Dim getDate = Function(s) DateTime.ParseExact(s.ToString(), "yyyyMMdd", Nothing) 

Dim d1 = getDate(ds1) 
Dim d2 = getDate(ds2) 

Dim diff = d1.Subtract(d2) 
Dim result = diff.Days '13 
+0

pour obtenir VB.Net remplacer le 'var' avec' Dim' et supprimer les points-virgules –

+1

+1 pour ne pas répéter ParseExact() –

+0

lol ... Je viens de le changer donc c'était VB ... je suppose que je devrais le changer . –

0
DateTime x = DateTime.ParseExact("19920715", "yyyyMMdd",CultureInfo.InvariantCulture); 
      DateTime y = DateTime.ParseExact("20141025", "yyyyMMdd", CultureInfo.InvariantCulture); 
      int days = (y.Subtract(x).Days); 
      float years = days/365; 
Questions connexes