zoukankan      html  css  js  c++  java
  • SQL SERVER 日期转换

    use master go

    --1.  当前系统日期、时间 select getdate() 

    --2.时间操作 dateadd  在向指定日期加上一段时间的基础上,返回新的 datetime 值

    select getdate()                    as '当前系统日期、时间'

    select dateadd(year,2,getdate())    as'多于两年'

    select dateadd(month,2,getdate())   as '多余两月'

    select dateadd(day,2,getdate())     as '多余两天'  --2012-04-13 13:54:32.280

    select dateadd(week,2,getdate())    as '多余两周'

    select dateadd(weekday,2,getdate()) as '多余两天'

    select dateadd(hour,2,getdate())    as '多余两小时'

    select dateadd(Minute,2,getdate())  as '多余两分钟'

    select dateadd(Second,2,getdate())  as '多余两分钟'

    --3. datediff 返回跨两个指定日期的日期和时间边界数。

     select datediff(year,getdate(),dateadd(year,2,getdate()))     --返回:2  

    select datediff(month,getdate(),dateadd(month,2,getdate()))   --返回:2  

    select datediff(day,'2012-4-13','2012-4-15')                  --返回:2  

    select datediff(day,getdate(),dateadd(day,2,getdate()))       --返回:2  

    select datediff(week,getdate(),dateadd(week,2,getdate()))     --返回:2  

    select datediff(hour,getdate(),dateadd(hour,2,getdate()))     --返回:2  

    select datediff(Minute,getdate(),dateadd(Minute,2,getdate())) --返回:2  

    select datediff(Second,getdate(),dateadd(Second,2,getdate())) --返回:2

    --4. datepart 返回代表指定日期的指定日期部分的整数。 --如果需要得到自己需要的日期,则需要讲日期时间格式化

    SELECT DATEPART(year, getdate())    as '年份'    --返回 ?

    SELECT DATEPART(month, getdate())   as '月份'    --返回 ?

    SELECT DATEPART(day, getdate())     as '日期' --返回 ?

    SELECT DATEPART(week, getdate())    as  '本年第几周数'     --返回 ?

    SELECT (DATEPART(weekday, getdate())-1)  as '今天是周几?'   --返回 ?

    SELECT DATEPART(hour, getdate())    as '小时' --返回 ?

    SELECT DATEPART(Minute, getdate())  as '分钟'  --返回 ?

    SELECT DATEPART(Second, getdate())  as '秒时'   --返回 ?

    --5. datename 返回代表指定日期的指定日期部分的字符串

    SELECT datename(weekday, getdate())                  as '今天是星期几?'

    SELECT datename(month,convert(varchar(10), getdate(),126)) as '今天是几月份?'

    SELECT datename(day,convert(varchar(10), getdate(),126))   as '今天是几号?'

    SELECT datename(year,convert(varchar(10), getdate(),126))   as '今年是哪年?'

    函数DATEDIFF(mm,0,getdate())是计算当前日期和“1900-01-01 00:00:00.000”这个日期之间的月数。

    记住:时期和时间变量和毫秒一样是从“1900-01-01 00:00:00.000”开始计算的。这就是为什么你可以在DATEDIFF函数中指定第一个时间表达式为“0”。

    下一个函数是DATEADD,增加当前日期到“1900-01-01”的月数。通过增加预定义的日期“1900-01-01”和当前日期的月数,我们可以获得这个月的第一天。

    另外,计算出来的日期的时间部分将会是“00:00:00.000”。      

    这个计算的技巧是先计算当前日期到“1900-01-01”的时间间隔数,然后把它加到“1900-01-01”上来获得特殊的日期,这个技巧可以用来计算很多不同的日期。下一个例子也是用这个技巧从当前日期来产生不同的日期。

    本周的星期一      这里我是用周(wk)的时间间隔来计算哪一天是本周的星期一。      

    SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)      

    一年的第一天      现在用年(yy)的时间间隔来显示这一年的第一天。      SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)      

    季度的第一天      假如你要计算这个季度的第一天,这个例子告诉你该如何做。      SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)      

    当天的半夜      曾经需要通过getdate()函数为了返回时间值截掉时间部分,就会考虑到当前日期是不是在半夜。假如这样,这个例子使用DATEDIFF和DATEADD函数来获得半夜的时间点。      SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)      深入DATEDIFF和DATEADD函数计算      

    你可以明白,通过使用简单的DATEDIFF和DATEADD函数计算,你可以发现很多不同的可能有意义的日期。      

    目前为止的所有例子只是仅仅计算当前的时间和“1900-01-01”之间的时间间隔数量,然后把它加到“1900-01-01”的时间间隔上来计算出日期。假定你修改时间间隔的数量,或者使用不同的时间间隔来调用DATEADD函数,或者减去时间间隔而不是增加,那么通过这些小的调整你可以发现和多不同的日期。      

    这里有四个例子使用另外一个DATEADD函数来计算最后一天来分别替换DATEADD函数前后两个时间间隔。

    上个月的最后一天      

    这是一个计算上个月最后一天的例子。它通过从一个月的最后一天这个例子上减去3毫秒来获得。有一点要记住,在Sql Server中时间是精确到3毫秒。这就是为什么我需要减去3毫秒来获得我要的日期和时间。      SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))      

    计算出来的日期的时间部分包含了一个Sql Server可以记录的一天的最后时刻(“23:59:59:997”)的时间。      

    去年的最后一天      连接上面的例子,为了要得到去年的最后一天,你需要在今年的第一天上减去3毫秒。      SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))      

    本月的最后一天      现在,为了获得本月的最后一天,我需要稍微修改一下获得上个月的最后一天的语句。修改需要给用DATEDIFF比较当前日期和“1900-01-01”返回的时间间隔上加1。通过加1个月,我计算出下个月的第一天,然后减去3毫秒,这样就计算出了这个月的最后一天。这是计算本月最后一天的SQL脚本。      SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))      

    本年的最后一天      你现在应该掌握这个的做法,这是计算本年最后一天脚本      SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。      

    本月的第一个星期一      好了,现在是最后一个例子。这里我要计算这个月的第一个星期一。这是计算的脚本。      select DATEADD(wk, DATEDIFF(wk,0,   dateadd(dd,6-datepart(day,getdate()),getdate())   ), 0)      在这个例子里,我使用了“本周的星期一”的脚本,并作了一点点修改。修改的部分是把原来脚本中“getdate()”部分替换成计算本月的第6天,在计算中用本月的第6天来替换当前日期使得计算可以获得这个月的第一个星期一。      总结      我希望这些例子可以在你用DATEADD和DATEDIFF函数计算日期时给你一点启发。通过使用这个计算日期的时间间隔的数学方法,我发现为了显示两个日期之间间隔的有用历法是有价值的。注意,这只是计算出这些日期的一种方法。要牢记,还有很多方法可以得到相同的计算结果。假如你有其他的方法,那很不错,要是你没有,我希望这些例子可以给你一些启发,当你要用DATEADD和DATEDIFF函数计算你程序可能要用到的日期时。 ---------------------------------------------------------------   附录,其他日期处理方法      

    1)去掉时分秒   declare @ datetime   set @ = getdate() --'2003-7-1 10:00:00'   SELECT @,DATEADD(day, DATEDIFF(day,0,@), 0)      

    2)显示星期几   select datename(weekday,getdate())      

    3)如何取得某个月的天数   declare @m int   set @m=2 --月份   select datediff(day,'2003-'+cast(@m as varchar)+'-15' ,'2003-'+cast(@m+1 as varchar)+'-15')   另外,取得本月天数   select datediff(day,cast(month(GetDate()) as varchar)+'-'+cast(month(GetDate()) as varchar)+'-15' ,cast(month(GetDate()) as varchar)+'-'+cast(month(GetDate())+1 as varchar)+'-15')   或者使用计算本月的最后一天的脚本,然后用DAY函数区最后一天   SELECT Day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)))      

    4)判断是否闰年:   SELECT case day(dateadd(mm, 2, dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)))) when 28 then '平年' else '闰年' end   或者   select case datediff(day,datename(year,getdate())+'-02-01',dateadd(mm,1,datename(year,getdate())+'-02-01'))   when 28 then '平年' else '闰年' end      

    5)一个季度多少天   declare @m tinyint,@time smalldatetime   select @m=month(getdate())   select @m=case when @m between 1 and 3 then 1   when @m between 4 and 6 then 4   when @m between 7 and 9 then 7   else 10 end   select @time=datename(year,getdate())+'-'+convert(varchar(10),@m)+'-01'   select datediff(day,@time,dateadd(mm,3,@time))

    mssqlserver字符串日期互相转换

    declare @str varchar(15) declare @dt datetime select @str='2005-8-26' set @dt = cast (@str as datetime) --转换为日期付给一个日期型的变量 /*print @dt
    print convert (varchar(10),@dt,120) --转化为不同的格式输出,集体参数看帮助 print convert (varchar(10),@dt,111) print convert (varchar(10),@dt,101)*/
    /*用convert是明确地转换一数据类型表示到另一个,对于dateadd等等日期函数 的参数不一定是日期格式,只要可以转化即可,对于convert,字符串和日期是 2种不同的格式,这点要注意,我们来看看一个试验:*/
    print dateadd(dd,1,@str) print dateadd(dd,1,@dt)
    print convert (varchar(10),@str,120) print convert (varchar(10),@dt,120)
    /* Aug 27 2005 12:00AM --dataadd认为字符串'2005-8-26'和日期'2005-8-26'是一样 Aug 27 2005 12:00AM 2005-8-26 /*convert 认为字符串'2005-8-26'和日期'2005-8-26'不一样*/ 2005-08-26 /*对于字符串对应的日期格式失效*/ */  

    我们经常出于某种目的需要使用各种各样的日期格式,当然我们可以使用字符串操作来构造各种日期格式,但是有现成的函数为什么不用呢?
    SQL Server中文版的默认的日期字段datetime格式是yyyy-mm-dd Thh:mm:ss.mmm
    例如:
    select getdate()
    2004-09-12 11:06:08.177
    整理了一下SQL Server里面可能经常会用到的日期格式转换方法:
    举例如下:
    select CONVERT(varchar, getdate(), 120 )
    2004-09-12 11:06:08
    select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','')
    20040912110608
    select CONVERT(varchar(12) , getdate(), 111 )
    2004/09/12
    select CONVERT(varchar(12) , getdate(), 112 )
    20040912
    select CONVERT(varchar(12) , getdate(), 102 )
    2004.09.12
    select CONVERT(varchar(12) , getdate(), 101 )
    09/12/2004
    select CONVERT(varchar(12) , getdate(), 103 )
    12/09/2004
    select CONVERT(varchar(12) , getdate(), 104 )
    12.09.2004
    select CONVERT(varchar(12) , getdate(), 105 )
    12-09-2004
    select CONVERT(varchar(12) , getdate(), 106 )
    12 09 2004
    select CONVERT(varchar(12) , getdate(), 107 )
    09 12, 2004
    select CONVERT(varchar(12) , getdate(), 108 )
    11:06:08
    select CONVERT(varchar(12) , getdate(), 109 )
    09 12 2004 1
    select CONVERT(varchar(12) , getdate(), 110 )
    09-12-2004
    select CONVERT(varchar(12) , getdate(), 113 )
    12 09 2004 1
    select CONVERT(varchar(12) , getdate(), 114 )
    11:06:08.177
     
     
    Without century (yy)
    With century (yyyy)
    Standard
    Input/Output**
    -
    0 or 100 (*)
    Default
    mon dd yyyy hh:miAM (or PM)
    1
    101
    USA
    mm/dd/yy
    2
    102
    ANSI
    yy.mm.dd
    3
    103
    British/French
    dd/mm/yy
    4
    104
    German
    dd.mm.yy
    5
    105
    Italian
    dd-mm-yy
    6
    106
    -
    dd mon yy
    7
    107
    -
    Mon dd, yy
    8
    108
    -
    hh:mm:ss
    -
    9 or 109 (*)
    Default + milliseconds
    mon dd yyyy hh:mi:ss:mmmAM (or PM)
    10
    110
    USA
    mm-dd-yy
    11
    111
    JAPAN
    yy/mm/dd
    12
    112
    ISO
    yymmdd
    -
    13 or 113 (*)
    Europe default + milliseconds
    dd mon yyyy hh:mm:ss:mmm(24h)
    14
    114
    -
    hh:mi:ss:mmm(24h)
    -
    20 or 120 (*)
    ODBC canonical
    yyyy-mm-dd hh:mi:ss(24h)
    -
    21 or 121 (*)
    ODBC canonical (with milliseconds)
    yyyy-mm-dd hh:mi:ss.mmm(24h)
    -
    126(***)
    ISO8601
    yyyy-mm-dd Thh:mm:ss:mmm(no spaces)
    -
    130*
    Kuwaiti
    dd mon yyyy hh:mi:ss:mmmAM
    -
    131*
    Kuwaiti
    dd/mm/yy hh:mi:ss:mmmAM
  • 相关阅读:
    HDU 5912 Fraction (模拟)
    CodeForces 722C Destroying Array (并查集)
    CodeForces 722B Verse Pattern (水题)
    CodeForces 722A Broken Clock (水题)
    CodeForces 723D Lakes in Berland (dfs搜索)
    CodeForces 723C Polycarp at the Radio (题意题+暴力)
    CodeForces 723B Text Document Analysis (水题模拟)
    CodeForces 723A The New Year: Meeting Friends (水题)
    hdu 1258
    hdu 2266 dfs+1258
  • 原文地址:https://www.cnblogs.com/zy20160117/p/7092777.html
Copyright © 2011-2022 走看看