一,日期的格式化

格式化是指把日期类型(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')

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

FORMAT(123456789,'###-##-####') AS 'Custom Number Result
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 )
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 )

三,日期操作

日期函数: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 dateset @date=getdate()select EOMONTH(@date) as CurrentMonth_EndDay,    EOMONTH(@date,1) as NextMonth_EndDay,    EOMONTH(@date,-1) as LastMonth_EndDay

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

declare @date dateset @date=getdate()select DATEFROMPARTS(year(@date),month(@date),1)
FORMAT(GETDATE(),'yyyyMM01')

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

SWITCHOFFSET ( DATETIMEOFFSET, time_zone )
  • DATETIMEOFFSET:DateTimeOffset(n)类型的变量
  • time_zone:指定的目标时区数据,格式是  [+|-] hh:mm

使用SwitchOffset()函数把DateTimeOffset的时区偏移(Offset)切换到指定的时区中,例如,把本地时间的时区东八区切换到东七区:

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

4,当前日期是周几

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

SET DATEFIRST { number | @number_var }
set DATEFIRST 1select @@datefirst
set DATEFIRST 1select datepart(WEEKDAY,getutcdate())set DATEFIRST 2--select @@datefirstselect datepart(WEEKDAY,getutcdate())
set DATEFIRST 2select Datepart(weekday, getdate()+@@datefirst - 1)set DATEFIRST 1select Datepart(weekday, getdate()+@@datefirst - 1)

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

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

select @@language
select alias,name, * from sys.syslanguages
set LANGUAGE 'Simplified Chinese'set LANGUAGE 'us_english'
set LANGUAGE 'Simplified Chinese'select  DATENAME(WEEKDAY,getutcdate())set LANGUAGE 'us_english'select  DATENAME(WEEKDAY,getutcdate())

函数名称 参数 示例 说明

dateadd(日期部分,数字,日期)

select dateadd(year,45,'1990-12-11') 返回 2035-12-11 00:00:00.000
select dateadd(month,45,'1990-12-11') 返回 1994-09-11 00:00:00.000
select dateadd(mm,45,'1990-12-11') 返回 1994-09-11 00:00:00.000
select dateadd(qq,12,'1990-12-11') 返回 1993-12-11 00:00:00.000
select dateadd(hh,12,'1990-12-11') 返回 1990-12-11 12:00:00.000
select dateadd(yy,-12,'1990-12-11') 返回 1978-12-11 00:00:00.000

返回给指定日期加上一个时间间隔后的新的日期值。
数字:用于与指定的日期部分相加的值。如果指定了非整数值,则将舍弃该值的小数部分,舍弃时不遵循四舍五入。
日期:指定的原日期
在此函数中 :dw,dy,dd 效果一样都表示天

datediff(日期部分,开始日期,结束日期)

select datediff(yy,'1990-12-11','2008-9-10') 返回 18
selectdatediff(mm,'2007-12-11','2008-9-10') 返回 9

返回两个指定日期的指定日期部分的差的整数值。
在此函数中dw,dy,dd 效果一样都表示天

datename(日期部分,日期)

select datename(mm,'2007-12-11') 返回 12select datename(dw,'2007-12-11') 返回星期二select datename(dd, ‘2007-12-11') 返回 11select datename(wk, ‘2007-12-11') – 50 一年中的第几个星期select datename(dy, ‘2007-12-11') – 345 一年中的第几天select DATENAME(YYYY,GETDATE()) + DATENAME(MM,GETDATE()) – 201803

dw 表示一星期中星期几
wk 表示一年中的第几个星期
dy 表示一年中的第几天

datepart(日期部分,日期)

select datepart(mm,'2007-12-11')返回 12select datepart(dw,'2007-12-11')返回 3select datepart(dd, ‘2007-12-11')返回 11select DATEPART(YYYY,GETDATE()) + DATENAME(MM,GETDATE()) – 2021

wk 表示一年中的第几个星期
dy 表示一年中的第几天,
dw 表示一星期中星期几,返回整数默认 1 为星期天

getdate()无参数

select getdate() 返回 2222-02-22 12:34:19.070

getutcdate()无参数

select getutcdate() 返回2222-02-22 04:34:19.073

1、上月的第一天

SELECT CONVERT(CHAR(10),DATEADD(month,-1,DATEADD(dd,-DAY(GETDATE())+1,GETDATE())),111)
SELECT CONVERT(CHAR(10),DATEADD(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()),0)),111)+' 23:59:59'
SELECT CONVERT(CHAR(10),DATEADD(dd,-DAY(GETDATE())+1,GETDATE()),111)
SELECT CONVERT(CHAR(10),DATEADD(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+1,0)),111)+' 23:59:59'
SELECT CONVERT(CHAR(10),DATEADD(m,1,DATEADD(dd,-DAY(GETDATE())+1,GETDATE())),111)
SELECT CONVERT(CHAR(10),DATEADD(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+2,0)),111)+' 23:59:59'

缩写year年yy,yyyy
quarter季qq,q
month月mm, m
dayofyear天(请看函数中的说明)dy, y
day天(请看函数中的说明)dd, d
week星期wk, ww
weekday天(请看函数中的说明)dw, w
hour小时hh
minute分钟mi, n
second秒ss, s
millisecond毫秒ms

==================================================

Sql Server 查询指定范围(一周,一月,本周,本月等)内的数据

1.查询今日的所有数据

select * from 表名 where datediff(day,字段名,getdate())=0
select * from 表名 where datediff(day,字段名,getdate()-1)=0
selcet * from 表名 where datediff(week,字段名,getdate()-1)=0
select * from 表名 where datediff(d,字段名,getdate())<=30
select * from 表名 where datediff(m,字段名,getdate())<=1
select * from 表名 where datediff(dd,字段名,getdate())=0
select * from 表名 where datediff(hh,字段名,getdate())
select * from 表名 where datediff(week,字段名,getdate())=0
select * from 表名 where datediff(month,字段名,getdate())=0
select * from 表名 where datediff(qq,字段名,getdate())=0

更多相关文章

  1. MySQL系列多表连接查询92及99语法示例详解教程
  2. ES6 变量声明,箭头函数,数组方法,解构赋值,JSON,类与继承,模块化练习
  3. 箭头函数的基础使用
  4. Python技巧匿名函数、回调函数和高阶函数
  5. 浅析android通过jni控制service服务程序的简易流程
  6. Android(安卓)- Manifest 文件 详解
  7. Android的Handler机制详解3_Looper.looper()不会卡死主线程
  8. Android(安卓)bluetooth介绍(四): a2dp connect流程分析
  9. Android架构分析之使用自定义硬件抽象层(HAL)模块

随机推荐

  1. 计算时间差,你的方式或许不是最佳实践!
  2. 用最低的成本,提高你的代码稳壮性。
  3. 阿里规范不建议多表join,可这SQL要怎么写
  4. 为Android系统编译tun.ko模块
  5. Linux网络管理
  6. Java异常有多慢?
  7. 原创 | CRUD更要知道的Spring事务传播机
  8. SpringBoot自适应异常处理
  9. XUECIYUYAN
  10. Linux进程管理