五六个表多次连接,数据仅有200多条时
1.用convert把datetime转换成date
WITH Virtual_T AS ( SELECT a.[ID] ,a.[CityID] ,(select CityName from SlCity where ID=a.[CityID]) as CityName ,(select CityDistrictID from SlCity where ID=a.[CityID]) as CityDistrictID ,a.[ContractNo] ,a.[ContractSignedDate] ,a.[TransactionDate] ,a.[HousesProcedureDate] ,a.[Customer] ,a.[BuildingName] ,a.[HouseProperties] ,a.[HousingContractAmount] ,a.[DealPrice] ,a.[MarketingPrice] ,a.[PayType] ,a.[ExecuteScheduleRatio] ,a.[PropertyAddress] ,a.[RoomNo] ,a.[PropertyType] ,a.[BuidingType] ,a.[Decoration] ,a.[BuidingArea] ,a.[UnitPrice] ,a.[ApartmentLayout] ,a.[Seller] ,a.[ContactInfo] ,a.[CreatorID] ,b.[CreateDate] ,a.[EditDate] ,a.[IsDelete] ,b.PaymentOfWeek ,b.PaymentSummary ,b.ExtraHouseAmount ,b.PaymentOfNextWeek ,b.ProgressOfWeek ,b.Remark ,b.EditDate AS WeekEditDate ,(select min(StatDate) from [dbo].[SlReportWeekDefine] where LiSuMeiWeek =(select lisumeiweek from [SlReportWeekDefine] where StatDate=CONVERT(char(10),b.createDate,120))) as 'start' ,(select max(StatDate) from [dbo].[SlReportWeekDefine] where LiSuMeiWeek = (select lisumeiweek from [SlReportWeekDefine] where StatDate=CONVERT(char(10),b.createDate,120))) as 'end' ,(select LiSuMeiWeek from [SlReportWeekDefine] where StatDate=CONVERT(char(10),b.createDate,120)) as LiSuMeiWeek FROM [SlReportMortgageDetail] a WITH (NOLOCK) JOIN [SlReportMortgageDetailOfWeek] b ON a.ID=b.DetailID WHERE a.IsDelete=0 AND b.IsDelete=0 ),T AS ( SELECT a.*,b.CityDistrictName,ROW_NUMBER() OVER (ORDER BY a.CreateDate desc) AS [RowNumber],(Case LiSuMeiWeek when '200001'then '1' else '0' end) as IsCurrentWeek FROM Virtual_T a JOIN SlCityDistrict b ON a.CityDistrictID=b.ID WHERE 1=1 ) SELECT * FROM T
用时:
2.用cast把datetime转换成date
WITH Virtual_T AS ( SELECT a.[ID] ,a.[CityID] ,(select CityName from SlCity where ID=a.[CityID]) as CityName ,(select CityDistrictID from SlCity where ID=a.[CityID]) as CityDistrictID ,a.[ContractNo] ,a.[ContractSignedDate] ,a.[TransactionDate] ,a.[HousesProcedureDate] ,a.[Customer] ,a.[BuildingName] ,a.[HouseProperties] ,a.[HousingContractAmount] ,a.[DealPrice] ,a.[MarketingPrice] ,a.[PayType] ,a.[ExecuteScheduleRatio] ,a.[PropertyAddress] ,a.[RoomNo] ,a.[PropertyType] ,a.[BuidingType] ,a.[Decoration] ,a.[BuidingArea] ,a.[UnitPrice] ,a.[ApartmentLayout] ,a.[Seller] ,a.[ContactInfo] ,a.[CreatorID] ,b.[CreateDate] ,a.[EditDate] ,a.[IsDelete] ,b.PaymentOfWeek ,b.PaymentSummary ,b.ExtraHouseAmount ,b.PaymentOfNextWeek ,b.ProgressOfWeek ,b.Remark ,b.EditDate AS WeekEditDate ,(select min(StatDate) from [dbo].[SlReportWeekDefine] where LiSuMeiWeek =(select lisumeiweek from [SlReportWeekDefine] where StatDate=cast(b.CreateDate as date))) as 'start' ,(select max(StatDate) from [dbo].[SlReportWeekDefine] where LiSuMeiWeek = (select lisumeiweek from [SlReportWeekDefine] where StatDate=cast(b.CreateDate as date))) as 'end' ,(select LiSuMeiWeek from [SlReportWeekDefine] where StatDate=cast(b.CreateDate as date)) as LiSuMeiWeek FROM [SlReportMortgageDetail] a WITH (NOLOCK) JOIN [SlReportMortgageDetailOfWeek] b ON a.ID=b.DetailID WHERE a.IsDelete=0 AND b.IsDelete=0 ),T AS ( SELECT a.*,b.CityDistrictName,ROW_NUMBER() OVER (ORDER BY a.CreateDate desc) AS [RowNumber],(Case LiSuMeiWeek when '200001'then '1' else '0' end) as IsCurrentWeek FROM Virtual_T a JOIN SlCityDistrict b ON a.CityDistrictID=b.ID WHERE 1=1 ) SELECT * FROM T
结果用时:
结论:cast性能在转换date类型完爆convert,convert灵活性、类型适用性更广,更强大,所以性能损耗大;cast能满足使用的情况下,不用convert;程序能执行的情况下,避免在sql中使用内置函数