代码之家  ›  专栏  ›  技术社区  ›  Nix

SQL比较两个日期的最快方法(非标准varchar格式和datetime)

  •  4
  • Nix  · 技术社区  · 14 年前

    yyyy-mm-dd hh:mm:ss

    第二个是红头step-child格式的varchar(8) mmddyyyy

    现在这会很痛苦,因为没有简单的方法可以转换为相应的类型。有一种内置格式 yyyymmdd

    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))=@normal_date
    
    --convert normal date to ackward format
    select @normal_date
          where REPLACE(CONVERT(varchar(10),@normal_date,101), '/','')=@hated_date
    

    哪个更好?还是有更好的办法?

    编辑以显示成本

    --Operator cost (39%)
    CONVERT(datetime, RIGHT(@hated_date,4)+LEFT(@hated_date,2)+SUBSTRING(@hated_date,3,2))=@normal_date
    
    --Operator cost (57%)
    REPLACE(CONVERT(varchar(10),@normal_date,101), '/','')=@hated_date
    
    --Operator cost (46%)
    cast(stuff(stuff(@hated_date, 3,0, '/'),6,0,'/') as datetime)=@normal_date
    
    --Operator cost (47%)
    RIGHT(@hated_date, 4) + LEFT(@hated_date, 4)=@normal_date
    
    4 回复  |  直到 14 年前
        1
  •  5
  •   gbn    14 年前

    这是yyyymmdd不是吗?

    RIGHT(@hated_date, 4) + LEFT(@hated_date, 4)
    

    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'
    
    --SELECT @hated_date = RIGHT(@hated_date, 4) + LEFT(@hated_date, 4))
    
    select 'hurrah' WHERE @normal_date = RIGHT(@hated_date, 4) + LEFT(@hated_date, 4)
    
        2
  •  2
  •   A-K    14 年前

    另一种方法是:

    MONTH(@normal_date)*1000000 + DAY(@normal_date)*10000 + YEAR(@normal_date)
    =
    CAST(@hated_date AS INT)
    

        3
  •  2
  •   Denis Valeev    14 年前

    试试这个:

    select cast(stuff(stuff('11011974', 3,0, '/'),6,0,'/') as datetime)
    

    更新

    alt text

        4
  •  2
  •   HLGEM    14 年前

    建议您将列固定为datetime,或者向表中添加datetime列并转换数据,以便在输入数据时只需进行一次转换(当然,对于现有数据也只需进行一次转换),这可能是一个计算列。这不是您希望在select语句中执行的操作。如有必要,创建一个dateconversion表,其中每个可能的日期都采用两种格式,如果无法更改该表,则将其联接到该表中。