J'ai deux champs "date" auxquels je dois participer.SQL Méthode la plus rapide pour comparer deux dates (format varchar et datetime non standard)
Le premier est un datetime normal dans le format yyyy-mm-dd hh:mm:ss
Le second est un varchar (8) dans le format de l'enfant étape à tête rouge mmddyyyy
Maintenant, cela devient pénible, car il n'y a pas moyen facile de convertir au type correspondant. Il y a un format intégré qui est yyyymmdd
mais qui ne correspond pas au format varchar.
Il y a deux chemins que je vois:
declare @normal_date as datetime;
declare @hated_date as varchar(8);
set @normal_date='1974-11-01 00:00:00.000'
set @hated_date='11011974'
--cast to date time with string splits
select @normal_date
where CONVERT(datetime, RIGHT(@hated_date,4)+LEFT(@hated_date,2)+SUBSTRING(@hated_date,3,2))[email protected]_date
--convert normal date to ackward format
select @normal_date
where REPLACE(CONVERT(varchar(10),@normal_date,101), '/','')[email protected]_date
Quel est le meilleur? Ou y a-t-il un meilleur moyen?
Edité pour montrer les coûts
--Operator cost (39%)
CONVERT(datetime, RIGHT(@hated_date,4)+LEFT(@hated_date,2)+SUBSTRING(@hated_date,3,2))[email protected]_date
--Operator cost (57%)
REPLACE(CONVERT(varchar(10),@normal_date,101), '/','')[email protected]_date
--Operator cost (46%)
cast(stuff(stuff(@hated_date, 3,0, '/'),6,0,'/') as datetime)[email protected]_date
--Operator cost (47%)
RIGHT(@hated_date, 4) + LEFT(@hated_date, 4)[email protected]_date
Le coût de l'opérateur du plan d'exécution est dénué de sens. Vous devez exécuter chacun un million de fois en utilisant 'SET STATISTICS IO ON' et comparer. Je pense que vous trouverez que la plupart d'entre eux sont à peu près les mêmes. – ErikE