zoukankan      html  css  js  c++  java
  • SQL日期格式

    --按日统计
    SELECT CONVERT(VARCHAR(10),日期列,120) AS days,COUNT(1) AS totalCount FROM 表 GROUP BY CONVERT(VARCHAR(10),日期列,120) ORDER BY days

    --按周统计
    select datepart(week, 日期列) AS weekCount, sum(1) AS totalCount from 表 group by datepart(week, 日期列) ORDER BY weekCount

    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)

  • 相关阅读:
    html 上传图片前预览
    php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法
    php 计算 pdf文件页数
    php 获取半年内每个月的订单数量, 总价, 月份
    php 获取两个数组之间不同的值
    小程序支付功能
    关于nginx的Job for nginx.service failed because the control process exited with error code.错误
    linux 安装 Apollo
    MongoDB待续。。。
    ABP vNext...待续
  • 原文地址:https://www.cnblogs.com/shida-liu/p/10625977.html
Copyright © 2011-2022 走看看