SQL Server发展至今,
1、关于日期的格式的控制方法,
有传统的方法,比如CONVERT(),
也有比较便利的新方法,比如FORMAT(); eg: FORMAT(CAST(date AS DATE),'yyyy-MM') ps:年要用小写的yyyy, 月大写MM
2、同样,关于日期的操作函数,也分为传统方法:DATEADD()等,
也有便利的新方法:EOMonth()等。
格式化是指把日期类型(Date)、日期和时间类型转化为字符类型,通常使用CONVERT()和FORMAT()函数。
1,传统的CONVERT()
SQL Server控制日期的的显示格式,通常使用CONVERT()函数,通过控制style参数来控制日期显示的格式,但是,style很多,不利于记忆。
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )符合东方人阅读习惯的style及其显示格式如下:
101: mm/dd/yyyy110: mm-dd-yyyy111: yyyy/mm/dd112: yyyymmdd120: yyyy-mm-dd hh:mm:ss121: yyyy-mm-dd hh:mm:sssssssCONVERT()函数的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、4week:周在年中的序数,取值范围是 1 - 53dayofyear:天在年中的序数,取值范围是 1 - 366weekday:天在一周中的序数,取值范围是 1 - 7DATEPART()返回的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_EndDay2,月份的第一天
使用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())
--------------------------------------------------------------------------------------------------------------------------------
本文导读:SQL中的cast 和convert都是用来将一种数据类型的表达式转换为另一种数据类型的表达式。CAST 和 CONVERT 提供相似的功能,只是语法不同。在时间转化中一般用到convert,因为它比cast多加了一个style,可以转化成不同时间的格式。
一、语法:
1、使用 CAST
CAST ( expression AS data_type )
2、使用 CONVERT CONVERT (data_type[(length)], expression [, style])
3、参数说明
expression 是任何有效的表达式。 data_type: 目标系统所提供的数据类型,包括 bigint 和 sql_variant。不能使用用户定义的数据类型。 length nchar、nvarchar、char、varchar、binary 或 varbinary 数据类型的可选参数。 style 日期格式样式,借以将 datetime 或 smalldatetime 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型);或者字符串格式样式,借以将 float、real、money 或 smallmoney 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型)。
二、cast和convert的代码示例
SQL 代码 复制
select CAST('123' as int) -- 123 select CONVERT(int, '123') -- 123 select CAST(123.4 as int) -- 123 select CONVERT(int, 123.4) -- 123 select CAST('123.4' as int) select CONVERT(int, '123.4') -- Conversion failed when converting the varchar value '123.4' to data type int. select CAST('123.4' as decimal) -- 123 select CONVERT(decimal, '123.4') -- 123 select CAST('123.4' as decimal(9,2)) -- 123.40 select CONVERT(decimal(9,2), '123.4') -- 123.40 declare @Num money set @Num = 1234.56 select CONVERT(varchar(20), @Num, 0) -- 1234.56 select CONVERT(varchar(20), @Num, 1) -- 1,234.56 select CONVERT(varchar(20), @Num, 2) -- 1234.5600
三、convert函数的style参数说明
1、Date 和 Time 样式
不带世纪数位 (yy)带世纪数位 (yyyy)输入/输出-0 或 100mon dd yyyy hh:miAM(或 PM)11011 = mm/dd/yy
101 = mm/dd/yyyy
21022 = yy.mm.dd102 = yyyy.mm.dd
31033 = dd/mm/yy103 = dd/mm/yyyy
41044 = dd.mm.yy104 = dd.mm.yyyy
51055 = dd-mm-yy105 = dd-mm-yyyy
61066 = dd mon yy106 = dd mon yyyy
71077 = Mon dd, yy107 = Mon dd, yyyy
8108hh:mi:ss-9 或 109mon dd yyyy hh:mi:ss:mmmAM(或 PM)1011010 = mm-dd-yy110 = mm-dd-yyyy
1111111 = yy/mm/dd111 = yyyy/mm/dd
1211212 = yymmdd112 = yyyymmdd
-13 或 113dd mon yyyy hh:mi:ss:mmm(24h)14114dd mon yyyy hh:mi:ss:mmm(24h)-20 或 120yyyy-mm-dd hh:mi:ss(24h)-21 或 121yyyy-mm-dd hh:mi:ss.mmm(24h)-126yyyy-mm-ddThh:mi:ss.mmm(无空格)-127yyyy-mm-ddThh:mi:ss.mmmZ(无空格)-130dd mon yyyy hh:mi:ss:mmmAM-131dd/mm/yyyy hh:mi:ss:mmmAM
2、float 和 real 样式
值输出0(默认值)最多包含 6 位。 根据需要使用科学记数法。1始终为 8 位值。 始终使用科学记数法。2始终为 16 位值。 始终使用科学记数法。
3、money 和 smallmoney 样式
值输出0小数点左侧每三位数字之间不以逗号分隔,小数点右侧取两位数,例如 4235.98。1小数点左侧每三位数字之间以逗号分隔,小数点右侧取两位数,例如 3,510.92。2小数点左侧每三位数字之间以逗号分隔,小数点右侧取两位数,例如 3,510.92。126转换为 char(n) 或 varchar(n) 时,等同于样式 2