none
Conversion failed when converting datetime from character string. SQL Server @StartDate as datetime ..>= ('+ @StartDate +') RRS feed

  • Question

  • Hi,

    Can you please help me on this?

    When I try to pass my parameter it doesn't work. See below is my code :

     

    declare @SQL Varchar(4000)
    
    declare @CRM_FilteredAppointment nvarchar(2000)
    
    declare @CRM_FilteredSystemUser nvarchar(2000)
    
    declare @StartDate datetime
    
    declare @EndDate datetime
    
    
    
    
    
    set @CRM_FilteredSystemUser = 'Select * from FilteredSystemUser'
    
    set @StartDate = '20080101'
    
    set @EndDate = '20100101'
    
    
    
    set @CRM_FilteredAppointment = 'SELECT activityid, participationtypemask 
    
    FROM FilteredAppointment 
    
    WHERE FilteredAppointment.eu_calltype = 2
    
    AND FilteredAppointment.statecode = 1
    
    AND FilteredAppointment.scheduledend >= DateAdd( month, -1, GetDate())'
    
    
    
    set @SQL = ' 
    
    select distinct test.nb,
    
    SystemUser.businessunitidname, SystemUser.systemuserid, 
    
    SystemUser.eu_reporthubname, SystemUser.fullname AS OwnerIDname
    
    
    
    from
    
     (' + @CRM_FilteredSystemUser + ') AS SystemUser 
    
    LEFT JOIN
    
     (' + @CRM_FilteredAppointment + ') AS _FilteredAppointment ON
    
     SystemUser.systemuserid = _FilteredAppointment.ownerid 
    
    LEFT JOIN 
    
    (
    
    SELECT distinct count(Apt.activityid) as nb, SU.systemuserid
    
    FROM (' + @CRM_FilteredSystemUser + ') AS SU LEFT OUTER JOIN
    
     (' + @CRM_FilteredAppointment + ') as Apt ON 
    
     SU.systemuserid = Apt.ownerid FULL
    
     OUTER JOIN
    
     (' + @CRM_FilteredAppointment + ') AS AP ON FilteredAppointment.activityid = AP.activityid 
    
     AND (AP.participationtypemask = 8 OR AP.participationtypemask = 5) 
    
     WHERE Partyidname is not null 
    
    and CRMAF_FilteredAppointment.scheduledend >= ('+ @StartDate +')
    
    and CRMAF_FilteredAppointment.scheduledend <= ('+ @EndDate +')
    
    group by SU.systemuserid
    
    ) 
    
    as test ON SystemUser.systemuserid = test.systemuserid 
    
    '
    
    
    
    EXEC(@SQL)
    
    

     

    Thanks so much

    mardi 5 octobre 2010 15:27

Réponses

  • Donc il faut faire un convert pour forcer la conversion de la date en texte (au format ISO) :

    SET @MonTexte='SomeTextWithDate :'+CONVERT(VARCHAR,@StartDate,112)

    Voir http://msdn.microsoft.com/fr-fr/library/ms187928.aspx pour la fonction CONVERT (il doit y avoir également dans la doc une page sur les règles de conversion lorsqu'on fait des opérations entre des données qui n'ont pas le même type mais je ne la trouve pas)...

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Proposé comme réponse Alex Petrescu vendredi 8 octobre 2010 08:14
    • Marqué comme réponse Alex Petrescu mardi 12 octobre 2010 07:26
    jeudi 7 octobre 2010 14:07

Toutes les réponses

  • Hi,

    The @StartDate and @EndDate variables are typed as DATETIME not strings. You can't use + between dates and strings. You could declare them as VARCHAR(8) to keep them as strings for the concatenation operation. 

    Also I don't see a CRMAF_FilteredAppointment table or alias so the resulting SQL statement will likely be still wrong.

    As a side note I'm not sure where you are heading but it doesn't seems you really need dynamic SQL. My personal preference is to use dynamic SQL as a last resort...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mardi 5 octobre 2010 17:07
  • Bonjour,

     

    Comme nous sommes dans un forum de langue Française, je vous remercie de continuer la discussion en Français, pour donner la possibilité à tout le monde d’en profiter.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     

    mercredi 6 octobre 2010 13:42
  • Au temps pour moi. Comme je participe à des forums anglais et français, j'ai tendance à ne pas m'apercevoir qu'un message n'est pas dans la bonne langue.

    A bientôt en français comme peut-être en anglais ;-)


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mercredi 6 octobre 2010 15:51
  • Désolé je n'ai pas fais attetnion.

    J'aurais vraiment besoin que ma requete fonctionne comme ça :

    and CRMAF_FilteredAppointment.scheduledend >= ('+ @StartDate +')

    and CRMAF_FilteredAppointment.scheduledend <= ('
    + @EndDate +')

    comment puis je gérer ça...? je suis etonné que dynamique sql gère pas les dates....

    jeudi 7 octobre 2010 12:53
  • Donc il faut faire un convert pour forcer la conversion de la date en texte (au format ISO) :

    SET @MonTexte='SomeTextWithDate :'+CONVERT(VARCHAR,@StartDate,112)

    Voir http://msdn.microsoft.com/fr-fr/library/ms187928.aspx pour la fonction CONVERT (il doit y avoir également dans la doc une page sur les règles de conversion lorsqu'on fait des opérations entre des données qui n'ont pas le même type mais je ne la trouve pas)...

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Proposé comme réponse Alex Petrescu vendredi 8 octobre 2010 08:14
    • Marqué comme réponse Alex Petrescu mardi 12 octobre 2010 07:26
    jeudi 7 octobre 2010 14:07
  • Vous pouvez parfaitement laisser ceci en état en utilisant le tag de session DATEFORMAT qui permet de piloter l'ordre des parties de dates lors des conversions de chaines vers temporels.

    Syntaxe :

    SET DATEFORMAT <format>

    Avec <format> ::= { dmy | dym | mdy | myd | ydm | ymd }

    y = year

    m = month

    d = day

    Et pour d'autres informations sur le pilotage des dates et autres éléments temporels en SQL : http://baptiste-wicht.developpez.com/tutoriel/ms-sql/datetime/

    A +

    Frédéric BROUARD, Spécialiste modélisation, SGBR relationnel, optimisation, langage SQL.
    Le site sur le langage SQL et les SGBD relationnels : http://sqlpro.developpez.com/
    Expert SQL Server http://www.sqlspot.com : audit, optimisation, tuning, formation
    Le blog sur SQL / MS SQL Server http://blog.developpez.com/sqlpro
    * * * * * Enseignant au CNAM PACA et à l'ISEN à Toulon * * * * *

     


    Frédéric BROUARD, Spécialiste modélisation, SGBR relationnel, optimisation, langage SQL * * * Le site sur le langage SQL et les SGBD relationnels : http://sqlpro.developpez.com/ * * * Expert SQL Server http://www.sqlspot.com : audit, optimisation, tuning, formation * * * Le blog sur SQL / MS SQL Server http://blog.developpez.com/sqlpro * * * Enseignant CNAM PACA, ISEN Toulon, CESI/EXIA Aix En Provence
    lundi 18 octobre 2010 15:07