2012-06-08 6 views
-2

Je travaille sur une requête quelque chose nécessite DATE !!SQL convertir DATETIME EN VARCHAR?

DECLARE @YesterDay DATETIME, @Today DATETIME 

SET @YesterDay = DateAdd(DD, DateDiff(DD, 0, GETDATE())-1, 0) 
SET @Today = DateAdd(DD, DateDiff(DD, 0, GETDATE()), 0) 
select @YesterDay = convert(varchar, getdate()-1 , 110) 
select @Today = convert(varchar, getdate() , 110) 
EXEC @return_value = [dbo].[post_sec_admin_list_user_log] 
     @pDateFr = @YesterDay , 
     @pDateTo = @Today, 
     @pName = '', 
     @pSec = NULL 


@DateFr is varchar(50) 
@DateT0 is varchar(50) 

le @dateFr et @dateTo sont tous les deux varchar ..

Et j'essaie de l'exécuter, il imprimer le format de l'heure que cette déclaration d'erreur 2011-06-09 16:15:38.927

La conversion de un type de données varchar à un type de données datetime aboutit à une valeur hors plage.

De plus, le format varchar j'ai besoin est MM-DD-YYYY

Quelqu'un sait où est mon erreur à?

grâce

+3

Mettez votre erreur dans la question! –

+0

Salut, j'ai édité. déjà – cheeseng

+1

Quel RBDMS? Je devine SQL Server. Je suppose également que l'erreur se produit dans la procédure stockée 'post_sec_admin_list_user_log', pour laquelle vous n'avez pas publié le code. – Bridge

Répondre

0

Je pense que getdate() - 1 partie est erroné.

En outre, vous faisiez dateadd et datediff pourquoi? Essayez comme ceci:

SET @YesterDay = dateadd(dd, -1, GETDATE()) 
SET @Today = GETDATE() 
select @YesterDay = convert(varchar(50), dateadd(dd, -1, getdate()) , 110) 
select @Today = convert(varchar(50), getdate() , 110) 
EXEC @return_value = [dbo].[post_sec_admin_list_user_log] 
     @pDateFr = @YesterDay , 
     @pDateTo = @Today, 
     @pName = '', 
     @pSec = NULL 
+0

votre code est meilleur mais le code OP soumis va calculer "hier" correctement. Mais ce n'est pas ce qui cause le problème. Le problème est hier et aujourd'hui sont définis comme DATETIME et il essaie de les passer en tant que varchar. –

+0

@FedorHajdu en effet :) –

1

Votre code est source de confusion:

DECLARE @YesterDay DATETIME, @Today DATETIME 
SET @YesterDay = DateAdd(DD, DateDiff(DD, 0, GETDATE())-1, 0) 
SET @Today = DateAdd(DD, DateDiff(DD, 0, GETDATE()), 0) 
select @YesterDay = convert(varchar, getdate()-1 , 110) 
select @Today = convert(varchar, getdate() , 110) 

Vous déclarez-le comme DATETIME, valeur définie avec DateDiff puis écraser cette valeur avec une représentation varchar d'une date qui est recalculé en utilisant méthode différente.

Aux lignes 4 et 5 @ Hier et @ Aujourd'hui, les variables sont toujours DATETIME, car elles sont déclarées de cette façon.

EDIT: Comme mentionné dans le commentaire de ma réponse, vous avez besoin d'une variable pour passer à la procédure. Donc le correctif correct serait de déclarer les variables comme VARCHAR (50) au début et faire la conversion directement.

DECLARE @YesterDay VARCHAR(50), @Today VARCHAR(50) 
SELECT @YesterDay = convert(varchar(50), dateadd(dd, -1, getdate()) , 110) 
SELECT @Today = convert(varchar(50), getdate() , 110) 

Puis appelez la procédure comme vous l'avez fait à l'origine.

+1

En fait vous ne pouvez pas utiliser autre chose que des variables ou des valeurs statiques lorsque vous passez des paramètres, donc CONVERT (varchar, @Yesterday, 110) doit d'abord être assigné à une variable. – MartW

+0

@CodeByMoonlight vous avez raison, merci, corrigé. –