2017-09-19 2 views
0

Je reçois erreur dans la requête ci-dessous.J'ai un start_date et un end_date. Je veux obtenir la liste des dates entre GETDATE(). Quelqu'un peut-il m'aider à pointer l'erreur dans ma requête

Recherche

;with CTE as 
(select Dm.Category_id as Category_Label_id,Ca.Category_Name as Category_label_Name, 
convert(datetime, convert(varchar,year(getdate())) + '/' + convert(varchar,MONTH(GETDATE())) + '/' + convert(varchar, day(d.Expiry_Date))) as Exp_date1 
,DATEDIFF(day,getdate(), convert(varchar(10), convert(varchar,year(getdate())) + '/' + convert(varchar,MONTH(GETDATE())) + '/' + convert(varchar, day(d.Expiry_Date)))) as Days_remain 
,convert(datetime, DATEADD(day,-Reminder_Days, convert(varchar(10), convert(varchar,year(getdate())) + '/' + convert(varchar,MONTH(GETDATE())) + '/' + convert(varchar, day(d.Expiry_Date))))) as Exp_date2 
from documentalert d 
inner join document dm on dm.doc_id=d.doc_id 
inner join Category ca on ca.Category_id = dm.Category_id 
inner join category_value c on c.doc_id= dm.doc_id 
inner join dbo.Category_Key k on k.Category_Key_id= c.category_label_id 
and c.Category_Label_id=4 -- expiry date 
where d.alerttype='M' 
and dm.user_id=427 and dm.is_active=1) 
select * from cte where getdate() between Exp_date2 and Exp_date1 

Erreur

Msg 242, Niveau 16, État 3, Ligne 1 La conversion d'une donnée varchar de type à un type de données DATETIME a donné une valeur hors de portée.

+2

S'il vous plaît formater votre requête afin que nous puissions réellement le lire – HoneyBadger

+0

https://stackoverflow.com/users/1587819/honeybadger s'il vous plaît vérifier – Rushang

+0

autre que cela, sans quelques données d'échantillon, le schéma et la sortie désirée, il est difficile de voir ce qui se passe sur. – Tanner

Répondre

1

Je soupçonne que vous obtenez cette erreur que vous construisez les dates en prenant l'année et le mois de GETDATE() puis le jour de annexant Expiry_Date.

Si l'un de vos Expiry_Date valeurs ont le jour que 31, alors cela ne fonctionnera pas au mois de Septembre, qui GETDATE() retournera:

Exécutez le ci-dessous:

SELECT CONVERT(DATETIME, 
        CONVERT(VARCHAR, YEAR(GETDATE())) + '/' + 
        CONVERT(VARCHAR, MONTH(GETDATE())) + '/' + 
        CONVERT(VARCHAR, 31) -- Fails with 31 
      ) AS Exp_date1; 

erreurs avec:

Msg 242, niveau 16, état 3, la ligne 1 La conversion d'un type de données varchar à un type de données datetime a donné lieu à un extérieur de la plage de valeurs.

Où que celui-ci fonctionne:

SELECT CONVERT(DATETIME, 
        CONVERT(VARCHAR, YEAR(GETDATE())) + '/' + 
        CONVERT(VARCHAR, MONTH(GETDATE())) + '/' + 
        CONVERT(VARCHAR, 30) -- Works with 30 
      ) AS Exp_date1; 

Vous devez soit tenir compte des jours et des valeurs de mois dans votre logique ou utiliser le Expiry_Date une meilleure façon. Je ne sais pas pourquoi vous voulez ajouter une valeur journalière à l'année et au mois en cours. Si vous souhaitez filtrer les valeurs au mois en cours, utilisez une clause where pour vérifier d'abord la valeur.