添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
爱喝酒的核桃  ·  價目表-茶之魔手·  1 周前    · 
大力的树叶  ·  Release notes | ...·  4 周前    · 
独立的草稿本  ·  张剑萍 - 搜狗百科·  9 月前    · 

SQL Server发展至今,关于日期的格式的控制方法,有传统的方法,比如CONVERT(),也有比较便利的新方法,比如FORMAT();同样,关于日期的操作函数,也分为传统方法:DATEADD()等,也有便利的新方法:EOMonth()等。

一,日期的格式化

格式化是指把日期类型(Date)、日期和时间类型转化为字符类型,通常使用CONVERT()和FORMAT()函数。

1,传统的CONVERT()

SQL Server控制日期的的显示格式,通常使用CONVERT()函数,通过控制style参数来控制日期显示的格式,但是,style很多,不利于记忆。

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

符合东方人阅读习惯的style及其显示格式如下:

  • 101: mm/dd/yyyy
  • 110: mm-dd-yyyy
  • 111: yyyy/mm/dd
  • 112: yyyymmdd
  • 120: yyyy-mm-dd hh:mm:ss
  • 121: yyyy-mm-dd hh:mm:sssssss
  • CONVERT()函数的style是数字,记忆起来比较困难,并且只能按照系统定义的格式来显示,不够灵活。SQL Server提供更为灵活的转换函数FORMAT()。

    2,便利的FORMAT()函数

    FORMAT()函数,可以方便和灵活地控制数值、日期和时间类型的显示格式,通常情况下,FORMAT()函数主要用于格式化显示date/time类型和数值类型,参数format用于指定显示的格式,给予用户对格式更自由地控制,culture参数是可选的,用于指定显示的语言,该函数返回值的数据类型是NVARCHAR,如果格式转换失败,该函数返回NULL:

    FORMAT ( value, format [, culture ] ) 

    参数format使用#表示一个数值,参数 format 使用以下占位符来表示日期/时间的格式:

  • yyyy、MM、dd :表示年、月、日
  • hh:mm:ss fffffff :表示时、分、秒、毫秒
  • 使用“/”,“-”等作为连接各个部分(part)的分割符号
  • (1)把date/time格式化

    在format参数中指定日期/时间显示的格式,以特定的格式: “yyyy:MMdd hh:mm:ss fffffff” 显式日期/时间,例如:

    select format(SYSDATETIME(),'yyyy-MM-dd hh:mm:ss fffffff')

    (2)转换数值类型

    在参数format中使用#代表一个数字,使用相应的连接符,拼接成数字的格式字符,例如:

    FORMAT(123456789,'###-##-####') AS 'Custom Number Result

    二,日期和时间的结构

    常用的日期的构成(datepart)是: year、month、day、hour、minute、second、ns、TZoffset(简写为 tz)

    DATEPART ( datepart , date ) 
    YEAR ( date )  
    MONTH ( date )  
    DAY ( date ) 

    在实际的产品环境中,周、季度等都很有用途:

  • quarter :季度,取值范围是 1、2、3、4
  • week :周在年中的序数,取值范围是 1 - 53
  • dayofyear :天在年中的序数,取值范围是 1 - 366
  • weekday :天在一周中的序数,取值范围是 1 - 7
  • DATEPART()返回的datepart是int类型,如果想要返回字符类型,可以使用DATENAME()函数:

    DATENAME ( datepart , date ) 

    通过datepart来构造日期,常用的函数有:

    DATEFROMPARTS ( year, month, day )
    DATETIME2FROMPARTS ( year, month, day, hour, minute, seconds, fractions, precision ) 
    DATETIMEOFFSETFROMPARTS ( year, month, day, hour, minute, seconds, fractions, hour_offset, minute_offset, precision )
    TIMEFROMPARTS ( hour, minute, seconds, fractions, precision )  

    参数precision 是指小数秒的精度,指的是DateTime2(n)、DateTimeOffset(n),Time(n)中的n值,表示以多少位小数表示1s。

    三,日期操作

    日期函数:EOMonth、Format、DateAdd、DateDiff、SwitchOffset

    1,月份的最后一天

    函数 EOMonth() 返回指定日期的最后一天

    EOMONTH ( start_date [, month_to_add ] )

    参数注释:

  • start_date: 有两种输入方式,能够转换为Date的字符串类型 和 date 数据类型
  • month_to_add: 是int 类型,能够为正整数,负整数和0,默认值是0,如果省略,那么使用默认值0。
  • 例如,查看当前月的最后一天、下一个月的最后一天、上一个月的最后一天:

    declare @date date
    set @date=getdate()
    select EOMONTH(@date) as CurrentMonth_EndDay,
        EOMONTH(@date,1) as NextMonth_EndDay,
        EOMONTH(@date,-1) as LastMonth_EndDay

    2,月份的第一天

    使用DateFromParts() 函数,能够从3个正整数(year,month,day)中获取date 类型,只需要将day 参数设置1,就能获取月份的第一天的日期。

    declare @date date
    set @date=getdate()
    select DATEFROMPARTS(year(@date),month(@date),1) 

    也可以使用Format() 函数, 以字符串形式返回月份的第一天,例如,获取当前月份的第一天:

    FORMAT(GETDATE(),'yyyyMM01')

    3,切换时区

    把DateTimeOffset类型的数据切换到指定的时区,在转换过程中,UTC时间是固定的,依据固定的UTC时间,切换到特定时区的本地时间:

    SWITCHOFFSET ( DATETIMEOFFSET, time_zone )  

    参数注释:

  • DATETIMEOFFSET:DateTimeOffset(n)类型的变量
  • time_zone:指定的目标时区数据,格式是  [+|-] hh:mm
  • 使用SwitchOffset()函数把DateTimeOffset的时区偏移(Offset)切换到指定的时区中,例如,把本地时间的时区东八区切换到东七区:

    DECLARE @remote DATETIMEOFFSET 
    DECLARE @local DATETIMEOFFSET
    SET @local = SYSDATETIMEOFFSET()
    SET @remote = SWITCHOFFSET (@local, '+07:00')
    SELECT @remote AS remote_time,@local AS local_time

    可以看到,东7区的时间比东8区的时间晚一个小时。

    4,当前日期是周几

    在SQL Server中,通过DataFirst选项设置一周的第一天,序数是从1到7,表示一周的7天。

    SET DATEFIRST { number | @number_var }

    (1)可以通过@@datefirst来获取设置的值

    set DATEFIRST 1
    select @@datefirst

    (2)使用函数datepart函数获取当天是周几

    set DATEFIRST 1
    select datepart(WEEKDAY,getutcdate())
    set DATEFIRST 2
    --select @@datefirst
    select datepart(WEEKDAY,getutcdate())

    由于设置不同的DateFirst,会导致datepart返回不同的数值,所以必须借助@@DateFirst

    set DATEFIRST 2
    select Datepart(weekday, getdate()+@@datefirst - 1)
    set DATEFIRST 1
    select Datepart(weekday, getdate()+@@datefirst - 1)

    4,使用DateName获取WeekDay的名字

    WeekDay的名字跟系统的语言设置有管,跟DateFirst的设置没有关系

    (1) 查看当前的语言设置

    select @@language

    (2) 查看系统支持的语言

    select alias,name, * 
    from sys.syslanguages

    (3) 设置语言

    set LANGUAGE 'Simplified Chinese'
    set LANGUAGE 'us_english'

    (4) 使用DateName获取WeekDay的名字

    set LANGUAGE 'Simplified Chinese'
    select  DATENAME(WEEKDAY,getutcdate())
    set LANGUAGE 'us_english'
    select  DATENAME(WEEKDAY,getutcdate())

    参考文档:

    Date and Time Data Types and Functions (Transact-SQL)

    作者 悦光阴
    本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。