4 votes

Pourquoi ce TSQL coule-t-il datetime -> varchar -> datetime ?

Je suis récemment tombé sur ceci :

SELECT
    'Y',
    ltrim(rtrim(upper(Newly_Eligible)))
FROM Table
WHERE 
    Id = 1
AND
    (Convert(datetime, Convert(varchar, GETDATE(),103),103)  
    BETWEEN
        Convert(datetime,Convert(varchar, [Start_Date],103),103)
    AND
        Convert(datetime, Convert(varchar, [End_Date] ,103),103))

Start_Date , End_Date et évidemment GETDATE() sont tous datetime types. Pourquoi fait-il un cast vers un varchar et ensuite de nouveau vers un varchar ?

4voto

TheRealTy Points 2389

Cela permet de supprimer l'heure, afin de ne comparer que des dates au même format. Il y a plusieurs façons de le faire, et la méthode ci-dessus en est une.

Un autre est

select cast(floor(cast(getdate() as float)) as datetime)

4voto

RBarryYoung Points 23349

Cela tronque tout excès de valeur de l'heure du jour dans le datetime, ne laissant que la valeur de la date. (La clé est le code de conversion "103").

2voto

t-clausen.dk Points 17925

Je n'aime vraiment pas cette lente conversion des données en varchar et inversement.

Je suggère deux autres façons d'écrire votre code :

sql-server 2005 :

SELECT
    'Y'
    ltrim(rtrim(upper(Newly_Eligible)))
FROM table
WHERE 
    Id = 1
AND
    dateadd(day, datediff(day, 0,  getdate()), 0)
    BETWEEN
        dateadd(day, datediff(day, 0,  [Start_Date], 0)
    AND
    [End_Date] -- *

*Puisque la date d'arrivée comparée a été supprimée pour la partie temps, elle ne sera jamais plus grande que la date de fin pour le même jour.

sql-server 2008 :

SELECT
    'Y',
    ltrim(rtrim(upper(Newly_Eligible)))
FROM table
WHERE 
    Id = 1
AND
    cast(GETDATE() as date)
BETWEEN
    cast([Start_Date] as date)
AND
    [End_Date]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X