zoukankan      html  css  js  c++  java
  • Sql Server的DateTime相关

    计录,非原创

    --昨天,今天,明天:
    select dateadd(day,-1,getdate()) yesterday, getdate()Today, dateadd(day,1,getdate())tomorrow
    --1.一个月第一天的 本月的最后一天
    Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)             FDOfCurMon, 
    dateadd(ms,-3,DATEADD(mm, DATEDIFF(m, 0, getdate())+1, 0)) LDOfCurMon,
    dateadd(M, datediff(M, 0, dateadd(M, 1, getdate())), -1) LDOfCurMon,
    DATEADD(dd,-DAY(GETDATE())+1,GETDATE())[本月的第一天],
    DATEADD(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+1,0))[本月的最后一天]
    --6.上个月的最后一天
    SELECT DATEADD(month,-1,DATEADD(dd,-DAY(GETDATE())+1,GETDATE())) [上月的第一天],
     DATEADD(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()),0)) [上月的最后一天],
     dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)) LD_Of_PreviousMonth
    SELECT DATEADD(m,1,DATEADD(dd,-DAY(GETDATE())+1,GETDATE())) [下月的最后第一天],
    DATEADD(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+2,0))[下月的最后一天],

    DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0)[上月的第一天],

      DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -1) [下月的最后一天]


    --2.本周的星期一 Select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)MonOfToWeek --3.一年的第一天,本年的最后一天 Select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) FDOfCurYear,dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) LDOfCurYear --4.季度的第一天 Select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) FDOfCurQD --5.当天的半夜 Select DATEADD(dd, DATEDIFF(dd,0,getdate()), 0) SDateOfToDay --7.去年的最后一天 Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)) LDOfPreviousYear --10.本月的第一个星期一 select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0)FMonDayOfCurMonth -- 当天所在今年的第几周 select DATEDIFF(wk,dateadd(ms,0,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)),getdate()) WeekNum --本周 上周 本月 上月 DECLARE @ThisWeekStartTime DateTime,@ThisWeekEndTime DateTime,--本周 @LastWeekStartTime DateTime,@LastWeekEndTime DateTime,--上周       @ThisMonthStartTime DateTime,@ThisMonthEndTime DateTime,--本月          @LastMonthSartTime DateTime,@LastMonthEndTime DateTime;--上月  SELECT @ThisWeekStartTime = DATEADD(WEEK, DATEDIFF(WEEK, 0, CONVERT(DATETIME, GETDATE(), 120) - 1), 0) --本周开始时间 SELECT @ThisWeekEndTime = DATEADD(DAY, 6, DATEADD(WEEK, DATEDIFF(WEEK, 0, CONVERT(DATETIME, GETDATE(), 120) - 1), 0))--本周结束时间 SELECT @LastWeekStartTime = DATEADD(DAY, -7, DATEADD(WEEK, DATEDIFF(WEEK, 0, CONVERT(DATETIME, GETDATE(), 120) - 1), 0))--上周开始时间 SELECT @LastWeekEndTime = DATEADD(DAY, -1, DATEADD(WEEK, DATEDIFF(WEEK, 0, CONVERT(DATETIME, GETDATE(), 120) - 1), 0))--上周结束时间   SELECT @ThisMonthStartTime= dateadd(dd,-day(getdate())+1,getdate()) --本月开始时间 SELECT @ThisMonthEndTime = dateadd(dd,-day(getdate())+1,dateadd(m,1,getdate())) --本月结束时间 SELECT @LastMonthSartTime = dateadd(dd,-day(dateadd(month,-1,getdate()))+1,dateadd(month,-1,getdate()))--上月开始时间 SELECT @LastMonthEndTime = dateadd(dd,-day(getdate())+1,getdate()) --上月结束时间 select @ThisWeekStartTime [@ThisWeekStartTime ],@ThisWeekEndTime [@ThisWeekEndTime ], @LastWeekStartTime [@LastWeekStartTime ],@LastWeekEndTime [@LastWeekEndTime ], @ThisMonthStartTime [@ThisMonthStartTime ],@ThisMonthEndTime [@ThisMonthEndTime], @LastMonthSartTime [@LastMonthSartTime ],@LastMonthEndTime [@LastMonthEndTime]

    日期申明:   DECLARE @dt datetime =GETDATE()

    --1.指定日期该年的第一天或最后一天--A. 年的第一天,年的最后一天

    SELECT CONVERT(char(5),@dt,120)+'1-1' FDOfYear, CONVERT(char(5),@dt,120)+'12-31' LDOfYear
    --2.指定日期所在季度的第一天或最后一天
    --A. 季度的第一天 季度的最后一天(CASE判断法),季度的最后一天(直接推算法)
    SELECT CONVERT(datetime, CONVERT(char(8), DATEADD(Month, DATEPART(Quarter,@dt)*3-Month(@dt)-2, @dt), 120)+'1') DDOfQD,
    CONVERT(datetime, CONVERT(char(8),DATEADD(Month, DATEPART(Quarter,@dt)*3-Month(@dt),@dt),120) +CASE WHEN DATEPART(Quarter,@dt) in(1,4) THEN'31'ELSE'30'END) EDOfQD_Case,
    DATEADD(Day,-1, CONVERT(char(8), DATEADD(Month, 1+DATEPART(Quarter,@dt)*3-Month(@dt), @dt), 120)+'1') EDOfQD
    --A. 月的第一天,月的最后一天
    SELECT CONVERT(datetime,CONVERT(char(8),@dt,120)+'1')FDOfMonth,DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+'1')EDOfMonth


    --ERROR T-SQL
    --DECLARE @number int SET @number=1--星期四
    ----4.指定日期所在周的任意一天
    --SELECT DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)
    ----5.指定日期所在周的任意星期几 星期天做为一周的第1天 星期一做为一周的第1天
    --SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt)SunAsFirst,
    -- DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt)MonAsFirst

    在本文中,GetDate()获得的日期由两部分组成,分别是今天的日期和当时的时间: Select GetDate()  用DateName()就可以获得相应的年、月、日,然后再把它们连接起来就可以了:

    Select Datename(year,GetDate())+'-'+Datename (month,GetDate())+'-'+Datename(day,GetDate())

    另外,DateName()还可以获得到小时、时间、秒、星期几、第几周,分别如下:

    Select Datename(hour,GetDate()) Select Datename(minute,GetDate()) Select Datename(second,GetDate()) Select Datename(weekDay,GetDate()) Select Datename(week,GetDate())

    SQL中的日期类型DateTime的默认格式就是yyyy-mm-dd hh:mi:ss: mmm,可大多数的情况我们只想得到他的日期部分,而不许要后面的时间。上一篇中提到用Datename()函数来截取拼接出不包含时间部分的日期,现在再说一种方法,更加简单的获取到不包含时间的日期

    Convert函数转换字符串

    set nocount on;
    
          SELECT 'CONVERT(varchar(100), GETDATE(), 0)    'T_Sql,    CONVERT(varchar(100), GETDATE(), 0)     ConvertResult           --01 16 2021 11:16AM
    union SELECT 'CONVERT(varchar(100), GETDATE(), 1)   ',        CONVERT(varchar(100), GETDATE(), 1)                         --01/16/21
    union SELECT 'CONVERT(varchar(100), GETDATE(), 2)    ',        CONVERT(varchar(100), GETDATE(), 2)                           --01-16-21
    union SELECT 'CONVERT(varchar(100), GETDATE(), 3)    ',        CONVERT(varchar(100), GETDATE(), 3)                           --01 16 2021 11:16AM
    union SELECT 'CONVERT(varchar(100), GETDATE(), 4)    ',        CONVERT(varchar(100), GETDATE(), 4)                           --01/16/2021
    union SELECT 'CONVERT(varchar(100), GETDATE(), 5)    ',        CONVERT(varchar(100), GETDATE(), 5)                           --2021.01.16
    union SELECT 'CONVERT(varchar(100), GETDATE(), 6)    ',        CONVERT(varchar(100), GETDATE(), 6)                           --16/01/2021
    union SELECT 'CONVERT(varchar(100), GETDATE(), 7)    ',        CONVERT(varchar(100), GETDATE(), 7)                           --16.01.2021
    union SELECT 'CONVERT(varchar(100), GETDATE(), 8)    ',        CONVERT(varchar(100), GETDATE(), 8)                           --16-01-2021
    union SELECT 'CONVERT(varchar(100), GETDATE(), 9)    ',        CONVERT(varchar(100), GETDATE(), 9)                           --16 01 2021
    union SELECT 'CONVERT(varchar(100), GETDATE(), 10) ' ,        CONVERT(varchar(100), GETDATE(), 10)                        --01 16, 2021
    union SELECT 'CONVERT(varchar(100), GETDATE(), 11) ' ,        CONVERT(varchar(100), GETDATE(), 11)                        --11:16:27
    union SELECT 'CONVERT(varchar(100), GETDATE(), 12) ' ,        CONVERT(varchar(100), GETDATE(), 12)                        --01 16 2021 11:16:27:507AM
    union SELECT 'CONVERT(varchar(100), GETDATE(), 13) ' ,        CONVERT(varchar(100), GETDATE(), 13)                        --21/01/16
    union SELECT 'CONVERT(varchar(100), GETDATE(), 14) ' ,        CONVERT(varchar(100), GETDATE(), 14)                        --01-16-2021
    union SELECT 'CONVERT(varchar(100), GETDATE(), 20) ' ,        CONVERT(varchar(100), GETDATE(), 20)                        --2021/01/16
    union SELECT 'CONVERT(varchar(100), GETDATE(), 21) ' ,        CONVERT(varchar(100), GETDATE(), 21)                        --20210116
    union SELECT 'CONVERT(varchar(100), GETDATE(), 22) ' ,        CONVERT(varchar(100), GETDATE(), 22)                        --16 01 2021 11:16:27:507
    union SELECT 'CONVERT(varchar(100), GETDATE(), 23) ' ,        CONVERT(varchar(100), GETDATE(), 23)                        --11:16:27:507
    union SELECT 'CONVERT(varchar(100), GETDATE(), 24) ' ,        CONVERT(varchar(100), GETDATE(), 24)                        --210116
    union SELECT 'CONVERT(varchar(100), GETDATE(), 25) ' ,        CONVERT(varchar(100), GETDATE(), 25)                        --2021-01-16 11:16:27
    union SELECT 'CONVERT(varchar(100), GETDATE(), 100)' ,        CONVERT(varchar(100), GETDATE(), 100)                       --2021-01-16 11:16:27.507
    union SELECT 'CONVERT(varchar(100), GETDATE(), 101)' ,        CONVERT(varchar(100), GETDATE(), 101)                       --2021-01-16T11:16:27.507
    union SELECT 'CONVERT(varchar(100), GETDATE(), 102)' ,        CONVERT(varchar(100), GETDATE(), 102)                       --16 01 2021 11:16:27:507
    union SELECT 'CONVERT(varchar(100), GETDATE(), 103)' ,        CONVERT(varchar(100), GETDATE(), 103)                       -- 3 ????? ??????? 1442 11:16:27:507AM
    union SELECT 'CONVERT(varchar(100), GETDATE(), 104)' ,        CONVERT(varchar(100), GETDATE(), 104)                       -- 3/06/1442 11:16:27:507AM
    union SELECT 'CONVERT(varchar(100), GETDATE(), 105)' ,        CONVERT(varchar(100), GETDATE(), 105)                       --11:16:27:507
    union SELECT 'CONVERT(varchar(100), GETDATE(), 106)' ,        CONVERT(varchar(100), GETDATE(), 106)                       --21.01.16
    union SELECT 'CONVERT(varchar(100), GETDATE(), 107)' ,        CONVERT(varchar(100), GETDATE(), 107)                       --2021-01-16 11:16:27
    union SELECT 'CONVERT(varchar(100), GETDATE(), 108)' ,        CONVERT(varchar(100), GETDATE(), 108)                       --2021-01-16 11:16:27.507
    union SELECT 'CONVERT(varchar(100), GETDATE(), 109)' ,        CONVERT(varchar(100), GETDATE(), 109)                       --01/16/21 11:16:27 AM
    union SELECT 'CONVERT(varchar(100), GETDATE(), 110)' ,        CONVERT(varchar(100), GETDATE(), 110)                       --2021-01-16
    union SELECT 'CONVERT(varchar(100), GETDATE(), 111)' ,        CONVERT(varchar(100), GETDATE(), 111)                       --11:16:27
    union SELECT 'CONVERT(varchar(100), GETDATE(), 112)' ,        CONVERT(varchar(100), GETDATE(), 112)                       --2021-01-16 11:16:27.507
    union SELECT 'CONVERT(varchar(100), GETDATE(), 113)' ,        CONVERT(varchar(100), GETDATE(), 113)                       --16/01/21
    union SELECT 'CONVERT(varchar(100), GETDATE(), 114)' ,        CONVERT(varchar(100), GETDATE(), 114)                       --16.01.21
    union SELECT 'CONVERT(varchar(100), GETDATE(), 120)' ,        CONVERT(varchar(100), GETDATE(), 120)                       --16-01-21
    union SELECT 'CONVERT(varchar(100), GETDATE(), 121)' ,        CONVERT(varchar(100), GETDATE(), 121)                       --16 01 21
    union SELECT 'CONVERT(varchar(100), GETDATE(), 126)' ,        CONVERT(varchar(100), GETDATE(), 126)                       --01 16, 21
    union SELECT 'CONVERT(varchar(100), GETDATE(), 130)' ,        CONVERT(varchar(100), GETDATE(), 130)                       --11:16:27
    union SELECT 'CONVERT(varchar(100), GETDATE(), 131)' ,        CONVERT(varchar(100), GETDATE(), 131)                       --01 16 2021 11:16:27:507AM
    
    set nocount off

    varchar转换DateTIme回去,根据格式,比如 '01 16 2021 11:16AM'对应   --SELECT 'CONVERT(varchar(100), GETDATE(), 0) 'T_Sql, CONVERT(varchar(100), GETDATE(), 0) ConvertResult --01 16 2021 11:16AM

    declare @DateSt varchar(100) = '01 16 2021 11:16AM'
    declare @Date datetime= CONVERT(datetime,@DateSt,0)
    select @Date [Date],DATENAME(YY,@Date)Y,DATENAME(MM,@Date)M,DATENAME(DD,@Date)D
    --1. Style=101时,表示日期字符串为:mm/dd/yyyy格式 SELECT CONVERT(datetime,'11/1/2003',101) --结果:2003-11-01 00:00:00.000
    --2. Style=101时,表示日期字符串为:dd/mm/yyyy格式 SELECT CONVERT(datetime,'11/1/2003',103) --结果:2003-01-11 00:00:00.000
     
    
    /*== 日期转换为字符串 ==*/ DECLARE @dt datetime SET @dt='2003-1-11'
    --1. Style=101时,表示将日期转换为:mm/dd/yyyy 格式 SELECT CONVERT(varchar,@dt,101) --结果:01/11/2003
    --2. Style=103时,表示将日期转换为:dd/mm/yyyy 格式 SELECT CONVERT(varchar,@dt,103) --结果:11/01/2003
    
    /*== 这是很多人经常犯的错误,对非日期型转换使用日期的style样式 ==*/ SELECT CONVERT(varchar,'2003-1-11',101) --结果:2003-1-11
    --1. /*--说明 SET DATEFORMAT设置对使用CONVERT把字符型日期转换为日期的处理也具有影响 但不影响明确指定了style的CONVERT处理。 --*/
    --示例 ,在下面的示例中,第一个CONVERT转换未指定style,转换的结果受SET DATAFORMAT的影响,第二个CONVERT转换指定了style,转换结果受style的影响。 --设置输入日期顺序为 日/月/年 SET DATEFORMAT DMY
    --不指定Style参数的CONVERT转换将受到SET DATEFORMAT的影响 SELECT CONVERT(datetime,'2-1-2005') --结果: 2005-01-02 00:00:00.000
    --指定Style参数的CONVERT转换不受SET DATEFORMAT的影响 SELECT CONVERT(datetime,'2-1-2005',101) --结果: 2005-02-01 00:00:00.000 GO
    --2. /*--说明
    --如果输入的日期包含了世纪部分,则对日期进行解释处理时 年份的解释不受SET DATEFORMAT设置的影响。 --*/
    --示例,在下面的代码中,同样的SET DATEFORMAT设置,输入日期的世纪部分与不输入日期的世纪部分,解释的日期结果不同。 DECLARE @dt datetime
    --设置SET DATEFORMAT为:月日年 SET DATEFORMAT MDY
    --输入的日期中指定世纪部分 SET @dt='01-2002-03' SELECT @dt --结果: 2002-01-03 00:00:00.000
    --输入的日期中不指定世纪部分 SET @dt='01-02-03' SELECT @dt --结果: 2003-01-02 00:00:00.000 GO
    --3. /*--说明
    --如果输入的日期不包含日期分隔符,那么SQL Server在对日期进行解释时 将忽略SET DATEFORMAT的设置。 --*/
    --示例,在下面的代码中,不包含日期分隔符的字符日期,在不同的SET DATEFORMAT设置下,其解释的结果是一样的。 DECLARE @dt datetime
    --设置SET DATEFORMAT为:月日年 SET DATEFORMAT MDY SET @dt='010203' SELECT @dt --结果: 2001-02-03 00:00:00.000
    --设置SET DATEFORMAT为:日月年 SET DATEFORMAT DMY SET @dt='010203' SELECT @dt --结果: 2001-02-03 00:00:00.000
    --输入的日期中包含日期分隔符 SET @dt='01-02-03' SELECT @dt --结果: 2003-02-01 00:00:00.000
    --以下示例演示了在不同的语言环境(SET LANGUAGE)下,DATENAME与CONVERT函数的不同结果。 USE master
    --设置会话的语言环境为: English SET LANGUAGE N'English' SELECT DATENAME(Month,GETDATE()) AS [Month], DATENAME(Weekday,GETDATE()) AS [Weekday], CONVERT(varchar,GETDATE(),109) AS [CONVERT] /*--结果: Month    Weekday   CONVERT ------------- -------------- ------------------------------- March    Tuesday   Mar 15 2005 8:59PM --*/
    --设置会话的语言环境为: 简体中文 SET LANGUAGE N'简体中文' SELECT DATENAME(Month,GETDATE()) AS [Month], DATENAME(Weekday,GETDATE()) AS [Weekday], CONVERT(varchar,GETDATE(),109) AS [CONVERT] /*--结果 Month    Weekday    CONVERT
  • 相关阅读:
    线性回归模型练习
    《代码整洁之道》读书笔记五
    第八周总结
    第七周总结
    《代码整洁之道》读书笔记四
    《代码整洁之道》读书笔记三
    第六周总结
    《代码整洁之道》读书笔记二
    第五周总结
    HDFS的JavaAPI操作
  • 原文地址:https://www.cnblogs.com/wandia/p/14285311.html
Copyright © 2011-2022 走看看