按半小时规整
如 2008-2-2 12:12:13 => 2008-2-2 12:00:00
2008-3-4 9:45:28 => 2008-3-4 9:30:00
这个SQL中怎么写?

解决方案 »

  1.   

    declare @dt datetimeset @dt = '2008-2-2 12:12:13'
    select dateadd(minute,datediff(minute,0,@dt)/30*30,0)
    -- 2008-02-02 12:00:00.000set @dt = '2008-3-4 9:45:28 '
    select dateadd(minute,datediff(minute,0,@dt)/30*30,0)
    -- 2008-03-04 09:30:00.000
      

  2.   

    declare @date datetimeset @date='2008-2-2 12:12:13'
    select dateadd(minute, datediff(minute,convert(varchar(8),@date,112),@date)/30*30, convert(varchar(8),@date,112))
    /*
    2008-02-02 12:00:00.000
    */set @date='2008-3-4 9:45:28'
    select dateadd(minute, datediff(minute,convert(varchar(8),@date,112),@date)/30*30, convert(varchar(8),@date,112))
    /*
    2008-03-04 09:30:00.000
    */
      

  3.   

    declare @date datetime
    set @date=getdate()
    if datepart(minute,@date)>=30
    select cast(left(@date,14)+'30:00.000' as datetime)
    else
    select cast(left(@date,14)+'00:00.000' as datetime)
      

  4.   


    --测试了一下,4楼与9楼的稳定性好
    declare @dt datetimeset @dt = '5983-3-4 9:45:28 '
    select @dtselect dateadd(minute,datediff(minute,0,@dt)/30*30,0)select dateadd(minute, datediff(minute,convert(varchar(8),@dt,112),@dt)/30*30, convert(varchar(8),@dt,112))
    if datepart(minute,@dt)>=30
    select cast(left(@dt,14)+'30:00.000' as datetime)
    else
    select cast(left(@dt,14)+'00:00.000' as datetime)set @dt = '1799-1-1 9:45:28 '
    select @dtselect dateadd(minute,datediff(minute,0,@dt)/30*30,0)select dateadd(minute, datediff(minute,convert(varchar(8),@dt,112),@dt)/30*30, convert(varchar(8),@dt,112))if datepart(minute,@dt)>=30
    select cast(left(@dt,14)+'30:00.000' as datetime)
    else
    select cast(left(@dt,14)+'00:00.000' as datetime)
      

  5.   

    declare @dt datetime -- ==================================================set @dt = '1900-1-1 0:0:13' 
    select dateadd(minute,datediff(minute,0,@dt)/30*30,0) 
    -- 1900-01-01 00:00:00.000set @dt = '2999-12-31 23:45' 
    select dateadd(minute,datediff(minute,0,@dt)/30*30,0) 
    -- 2999-12-31 23:30:00.000-- ==================================================
    -- 以下为找到的有效临界点set @dt = '1760-1-1 0:0:13' 
    select dateadd(minute,datediff(minute,0,@dt)/30*30,0) 
    -- 1760-01-01 00:00:00.000set @dt = '5982-12-31 23:45' 
    select dateadd(minute,datediff(minute,0,@dt)/30*30,0) 
    -- 5982-12-31 23:30:00.000-- ==================================================
      

  6.   

    declare @dt datetime -- ==================================================set @dt = '1900-1-1 0:0:13' 
    select dateadd(minute,datediff(minute,0,@dt)/30*30,0) 
    -- 1900-01-01 00:00:00.000set @dt = '2999-12-31 23:45' 
    select dateadd(minute,datediff(minute,0,@dt)/30*30,0) 
    -- 2999-12-31 23:30:00.000-- ==================================================
    -- 以下为找到的有效临界点set @dt = '1760-1-1 0:0:13' 
    select dateadd(minute,datediff(minute,0,@dt)/30*30,0) 
    -- 1760-01-01 00:00:00.000set @dt = '5982-12-31 23:45' 
    select dateadd(minute,datediff(minute,0,@dt)/30*30,0) 
    -- 5982-12-31 23:30:00.000-- ==================================================
      

  7.   

    9楼的是乱写的(就是想换个方法实现一下)
    --------------------不能说是乱写,9楼的是最易理解的.
    在实际查询中,需把if换为case 
      

  8.   

    declare @dt datetimeset @dt = '2008-2-2 12:12:13'select cast(@dt as smalldatetime)