2016-03-02 2 views
1

Ce que j'essaie de faire ici, c'est d'ajouter un composant temporel à GETDATE() puisqu'il est converti en varchar (25). C'est ma déclaration, comment ferais-je?Erreur avec SQL CONVERT GETDATE() pour les années bissextiles

CONVERT(Varchar(25),YEAR(GETDATE())-1) 

Serait-il quelque chose le long CONVERT (VARCHAR (25), année (getDate()) -1)

Ce CONVERT est en fait une partie de:

DATEADD(m, 6,CAST(CONVERT(Varchar(25),MONTH(tblDateApt. Date)) + 
'/' + CONVERT(Varchar(25),DAY(tblDateApt. Date)) 
+ '/' + CONVERT(Varchar(25),YEAR(GETDATE())-1) As DateTime)) 

Le problème est quand je cours cette déclaration sur une date de l'année bissextile, je reçois une erreur. Je suis en train d'ajouter un temps de getDate avant qu'il ne soit casté DATETIME

EDIT 2

Je suis tout simplement essayer de faire cela donne revenir une valeur ...

select DATEADD(m, 6,CAST(CONVERT(Varchar(25),MONTH('2/29/2016')) + '/' + CONVERT(Varchar(25),DAY('2/29/2016')) + '/' + CONVERT(Varchar(25),YEAR(GETDATE())-1) As DateTime)) 
+2

Cela me semble un [XYPropblem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). quel est ton but? –

+0

Quand je fais le CONVERT (varchar25), année (GetDate()) - 1) sur une année bissextile, j'obtiens une erreur parce qu'elle essaie de retourner au 29/02/2015 - mais je sais si j'ai peut-être ajouté un temps composante à elle, il reviendrait simplement au 28/02/2016. Quand je fais un dateadd SELECT (yy, -1, '2/29/2016') il me donne 28/02/2016 mais il ne fonctionne pas dans cette requête – FatBoySlim7

+0

ce qui est les données comme dans tblDAteApt? Pouvez-vous montrer quelques exemples d'entrées des enregistrements avec lesquels vous rencontrez des problèmes et la sortie attendue de DAteAdd? – HLGEM

Répondre

2

Rompre la date en chaînes et la reconstruire en date n'est presque jamais la bonne solution. En supposant que je comprenne le problème, vous voulez obtenir les dates de votre base de données, et manipuler la partie année pour être une année avant l'année en cours.

Essayez ceci:

SELECT tblDateApt.[Date], 
     DATEADD(Month, 
       6, 
       DATEADD(YEAR, 
         YEAR(GETDATE()) - 1 - YEAR(tblDateApt.[Date]), 
         tblDateApt.[Date]) 
     ) 
FROM tblDateApt 

Modifié pour obtenir la date de 6 mois après la date dans la base de données après la manipulation à l'année dernière.

+0

Merci à toiuuuuuuuuuuuuuuuuu! – FatBoySlim7

+0

Si vous avez une seconde, pouvez-vous s'il vous plaît expliquer le 2ème DATEADD que vous avez? – FatBoySlim7

+1

C'est juste pour ajouter les 6 mois. Cela peut être fait par un seul dateadd, mais vous devez ensuite calculer le nombre de mois entre la dernière année et l'année dans la base de données. De cette façon, c'est plus lisible. –

1

Cette volonté vous laisser avec une valeur DateTime prise de tblDateApt.Date diminué d'un an et a augmenté de 6 mois (selon votre intention):

SELECT DATEADD(month, 
       6, 
       DATEADD(year, 
         YEAR(GETDATE()) - YEAR(tblDateApt.date) - 1, 
         tblDateApt.date 
        ) 
      ) 

Évitez les conversions et du contenu du texte.

+0

Je dois comme je divise le DateApt - dans DateApt jour, et mois mais j'utilise GETDATE pour obtenir l'année - Voir la fin de DateAdd juste avant 'comme DateTime' – FatBoySlim7

+2

@ FatBoySlim7 - Alors vous pouvez utiliser ' DATEADD (y, tblDateApt.date, YEAR (GETDATE()) - YEAR (tblDateApt.date)) 'pour ajuster l'année. – miroxlav

+0

merci, votre réponse est également correcte! – FatBoySlim7