SQLserver数据库时间处理函数
SQL Server Date 函数
下面的表格列出了 SQL Server 中最重要的内建日期函数:
函数 | 描述 |
---|---|
GETDATE() | 返回当前日期和时间 |
DATEPART() | 返回日期/时间的单独部分 |
DATEADD() | 在日期中添加或减去指定的时间间隔 |
DATEDIFF() | 返回两个日期之间的时间 |
CONVERT() | 用不同的格式显示日期/时间 |
GETDATE() 函数
定义和用法
GETDATE() 函数从 SQL Server 返回当前的时间和日期。
语法
1 | GETDATE() |
实例
例子 1
使用下面的 SELECT 语句:
1 | SELECT GETDATE() AS CurrentDateTime |
结果:
CurrentDateTime |
---|
2008-12-29 16:25:46.635 |
注释:上面的时间部分精确到毫秒。
例子 2
下面的 SQL 创建带有日期时间列 (OrderDate) 的 “Orders” 表:
1 | CREATE TABLE Orders |
请注意,OrderDate 把 GETDATE() 规定为默认值。结果是,当您在表中插入新行时,当前日期和时间自动插入列中。
现在,我们希望在 “Orders” 表中插入一条记录:
1 | INSERT INTO Orders (ProductName) VALUES ('Computer') |
“Orders” 表将成为这样:
OrderId | ProductName | OrderDate |
---|---|---|
1 | ‘Computer’ | 2008-12-29 16:25:46.635 |
DATEPART() 函数
定义和用法
DATEPART() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。
语法
1 | DATEPART(datepart,date) |
date 参数是合法的日期表达式。datepart 参数可以是下列的值:
datepart | 缩写 |
---|---|
年 | yy, yyyy |
季度 | qq, q |
月 | mm, m |
年中的日 | dy, y |
日 | dd, d |
周 | wk, ww |
星期 | dw, w |
小时 | hh |
分钟 | mi, n |
秒 | ss, s |
毫秒 | ms |
微妙 | mcs |
纳秒 | ns |
实例
假设我们有下面这个 “Orders” 表:
OrderId | ProductName | OrderDate |
---|---|---|
1 | ‘Computer’ | 2008-12-29 16:25:46.635 |
我们使用如下 SELECT 语句:
1 | SELECT DATEPART(yyyy,OrderDate) AS OrderYear, |
结果:
OrderYear | OrderMonth | OrderDay |
---|---|---|
2008 | 12 | 29 |
DATEADD() 函数
定义和用法
DATEADD() 函数在日期中添加或减去指定的时间间隔。
语法
1 | DATEADD(datepart,number,date) |
date 参数是合法的日期表达式。number 是您希望添加的间隔数;对于未来的时间,此数是正数,对于过去的时间,此数是负数。
datepart 参数可以是下列的值:
datepart | 缩写 |
---|---|
年 | yy, yyyy |
季度 | qq, q |
月 | mm, m |
年中的日 | dy, y |
日 | dd, d |
周 | wk, ww |
星期 | dw, w |
小时 | hh |
分钟 | mi, n |
秒 | ss, s |
毫秒 | ms |
微妙 | mcs |
纳秒 | ns |
实例
假设我们有下面这个 “Orders” 表:
OrderId | ProductName | OrderDate |
---|---|---|
1 | ‘Computer’ | 2008-12-29 16:25:46.635 |
现在,我们希望向 “OrderDate” 添加 2 天,这样就可以找到付款日期。
我们使用如下 SELECT 语句:
1 | SELECT OrderId,DATEADD(day,2,OrderDate) AS OrderPayDate |
结果:
OrderId | OrderPayDate |
---|---|
1 | 2008-12-31 16:25:46.635 |
DATEDIFF() 函数
定义和用法
DATEDIFF() 函数返回两个日期之间的时间。
语法
1 | DATEDIFF(datepart,startdate,enddate) |
startdate 和 enddate 参数是合法的日期表达式。
datepart 参数可以是下列的值:
datepart | 缩写 |
---|---|
年 | yy, yyyy |
季度 | qq, q |
月 | mm, m |
年中的日 | dy, y |
日 | dd, d |
周 | wk, ww |
星期 | dw, w |
小时 | hh |
分钟 | mi, n |
秒 | ss, s |
毫秒 | ms |
微妙 | mcs |
纳秒 | ns |
实例
例子 1
使用如下 SELECT 语句:
1 | SELECT DATEDIFF(day,'2008-12-29','2008-12-30') AS DiffDate |
结果:
DiffDate |
---|
1 |
例子 2
使用如下 SELECT 语句:
1 | SELECT DATEDIFF(day,'2008-12-30','2008-12-29') AS DiffDate |
结果:
DiffDate |
---|
-1 |
CONVERT() 函数
定义和用法
CONVERT() 函数是把日期转换为新数据类型的通用函数。
CONVERT() 函数可以用不同的格式显示日期/时间数据。
语法
1 | CONVERT(data_type(length),data_to_be_converted,style) |
data_type(length) 规定目标数据类型(带有可选的长度)。data_to_be_converted 含有需要转换的值。style 规定日期/时间的输出格式。
可以使用的 style 值:
格式编号 | 示例查询 | 示例结果 |
---|---|---|
0 | SELECT CONVERT(NVARCHAR, GETDATE(), 0) |
Aug 23 2019 1:39PM |
1 | SELECT CONVERT(NVARCHAR, GETDATE(), 1) |
08/23/19 |
2 | SELECT CONVERT(NVARCHAR, GETDATE(), 2) |
19.08.23 |
3 | SELECT CONVERT(NVARCHAR, GETDATE(), 3) |
23/08/19 |
4 | SELECT CONVERT(NVARCHAR, GETDATE(), 4) |
23.08.19 |
5 | SELECT CONVERT(NVARCHAR, GETDATE(), 5) |
23-08-19 |
6 | SELECT CONVERT(NVARCHAR, GETDATE(), 6) |
23 Aug 19 |
7 | SELECT CONVERT(NVARCHAR, GETDATE(), 7) |
Aug 23, 19 |
8、24 或 108 | SELECT CONVERT(NVARCHAR, GETDATE(), 8) |
13:39:17 |
9 或 109 | SELECT CONVERT(NVARCHAR, GETDATE(), 9) |
Aug 23 2019 1:39:17:090PM |
10 | SELECT CONVERT(NVARCHAR, GETDATE(), 10) |
08-23-19 |
11 | SELECT CONVERT(NVARCHAR, GETDATE(), 11) |
19/08/23 |
12 | SELECT CONVERT(NVARCHAR, GETDATE(), 12) |
190823 |
13 或 113 | SELECT CONVERT(NVARCHAR, GETDATE(), 13) |
23 Aug 2019 13:39:17:090 |
14 或 114 | SELECT CONVERT(NVARCHAR, GETDATE(), 14) |
13:39:17:090 |
20 或 120 | SELECT CONVERT(NVARCHAR, GETDATE(), 20) |
2019-08-23 13:39:17 |
21、25 或 121 | SELECT CONVERT(NVARCHAR, GETDATE(), 21) |
2019-08-23 13:39:17.090 |
22 | SELECT CONVERT(NVARCHAR, GETDATE(), 22) |
08/23/19 1:39:17 PM |
23 | SELECT CONVERT(NVARCHAR, GETDATE(), 23) |
2019-08-23 |
101 | SELECT CONVERT(NVARCHAR, GETDATE(), 101) |
08/23/2019 |
102 | SELECT CONVERT(NVARCHAR, GETDATE(), 102) |
2019.08.23 |
103 | SELECT CONVERT(NVARCHAR, GETDATE(), 103) |
23/08/2019 |
104 | SELECT CONVERT(NVARCHAR, GETDATE(), 104) |
23.08.2019 |
105 | SELECT CONVERT(NVARCHAR, GETDATE(), 105) |
23-08-2019 |
106 | SELECT CONVERT(NVARCHAR, GETDATE(), 106) |
23 Aug 2019 |
107 | SELECT CONVERT(NVARCHAR, GETDATE(), 107) |
Aug 23, 2019 |
110 | SELECT CONVERT(NVARCHAR, GETDATE(), 110) |
08-23-2019 |
111 | SELECT CONVERT(NVARCHAR, GETDATE(), 111) |
2019/08/23 |
112 | SELECT CONVERT(NVARCHAR, GETDATE(), 112) |
20190823 |
113 | SELECT CONVERT(NVARCHAR, GETDATE(), 113) |
23 Aug 2019 13:39:17.090 |
120 | SELECT CONVERT(NVARCHAR, GETDATE(), 120) |
2019-08-23 13:39:17 |
121 | SELECT CONVERT(NVARCHAR, GETDATE(), 121) |
2019-08-23 13:39:17.090 |
126 | SELECT CONVERT(NVARCHAR, GETDATE(), 126) |
2019-08-23T13:39:17.090 |
127 | SELECT CONVERT(NVARCHAR, GETDATE(), 127) |
2019-08-23T13:39:17.090 |
130 | SELECT CONVERT(NVARCHAR, GETDATE(), 130) |
22 ذو الحجة 1440 1:39:17.090P |
131 | SELECT CONVERT(NVARCHAR, GETDATE(), 131) |
22/12/1440 1:39:17.090PM |
实例
下面的脚本使用 CONVERT() 函数来显示不同的格式。我们将使用 GETDATE() 函数来获得当前的日期/时间:
1 | CONVERT(VARCHAR(19),GETDATE()) |
结果类似:
1 | Dec 29 2008 11:45 PM |
SQL Server 使用下列数据类型在数据库中存储日期或日期/时间值:
- DATE - 格式 YYYY-MM-DD
- DATETIME - 格式: YYYY-MM-DD HH:MM:SS
- SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS
- TIMESTAMP - 格式: 唯一的数字
实例
根据”填报类型”字段的值选择不同的时间字段
convert(varchar,(CASE new_type WHEN '1' THEN DATEADD(HOUR, 8, new_actualfinishtime) WHEN '2' THEN DATEADD(HOUR, 8, new_submitdate) END),23 )submittime
1.当new_type 值为1时取时间为 new_actualfinishtime字段的值,当new_type 值为2时取时间为new_submitdate字段的值.
(CASE new_type WHEN ‘1’ THEN new_actualfinishtime WHEN ‘2’ THEN new_submitdate END) 时间
2.现在因为数据库中的时间为0时区,所以转换为北京时间要加上8小时,所以为
(CASE new_type WHEN ‘1’ THEN DATEADD(HOUR, 8, new_actualfinishtime) WHEN ‘2’ THEN DATEADD(HOUR, 8, new_submitdate) END) 时间
3.然后又需要将时间转换为日期格式,
加过之后为
convert(varchar,(CASE new_type WHEN ‘1’ THEN DATEADD(HOUR, 8, new_actualfinishtime) WHEN ‘2’ THEN DATEADD(HOUR, 8, new_submitdate) END),23 ) 时间
查指定时间范围内的数据
因为时间在两个字段内,所以可以使用
(( new_actualfinishtime BETWEEN ‘${START_TIME}’ and’${FINISH_TIME}’) or ( new_submitdate BETWEEN ‘${START_TIME}’ and’${FINISH_TIME}’) )
其中’${START_TIME}’和’${FINISH_TIME}’为帆软报表内选择的时间,格式为其固定的格式
但是又想只选年月就查到当月的数据 ,所以使用
DateDiff (interval,date1,date2)函数
以interval 指定的方式,返回date2 与date1两个日期之间的差值 date2-date1
interval 格式使用Year和Month,差值都是0
(((DateDiff(month,new_actualfinishtime, ‘${START_TIME}’) = 0 ) and (DateDiff(year,new_actualfinishtime, ‘${START_TIME}’ ) = 0))or( (DateDiff(month,new_submitdate, ‘${START_TIME}’) = 0 ) and (DateDiff(year,new_submitdate, ‘${START_TIME}’ ) = 0)))
同时时间又因为时区问题需要加上8小时,所以再使用
DateAdd (interval,number,date)函数
以interval指定的方式,加上number之后的日期
最后为
(((DateDiff(month,DATEADD(HOUR, 8, new_actualfinishtime), ‘${START_TIME}’) = 0 ) and (DateDiff(year,DATEADD(HOUR, 8, new_actualfinishtime), ‘${START_TIME}’ ) = 0))or( (DateDiff(month,DATEADD(HOUR, 8, new_submitdate), ‘${START_TIME}’) = 0 ) and (DateDiff(year,DATEADD(HOUR, 8, new_submitdate), ‘${START_TIME}’ ) = 0)))
最终的sql
1 | SELECT |
SQLserver数据库函数参数格式说明
函数 | 参数/功能 |
---|---|
GetDate( ) | 返回系统目前的日期与时间 |
DateDiff (interval,date1,date2) | 以interval 指定的方式,返回date2 与date1两个日期之间的差值 date2-date1 |
DateAdd (interval,number,date) | 以interval指定的方式,加上number之后的日期 |
DatePart (interval,date) | 返回日期date中,interval指定部分所对应的整数值 |
DateName (interval,date) | 返回日期date中,interval指定部分所对应的字符串名称 |
interval的可选值
值 | 缩 写(Sql Server) | Access 和 ASP | 说明 |
---|---|---|---|
Year | Yy | yyyy | 年 1753 ~ 9999 |
Quarter | q | 季 1 ~ 4 | |
Month | Mm | m | 月1 ~ 12 |
Day of year | Dy | y | 一年的日数,一年中的第几日 1-366 |
Day | Dd | d | 日,1-31 |
Weekday | Dw | w | 一周的日数,一周中的第几日 1-7 |
Week | Wk | ww | 周,一年中的第几周 0 ~ 51 |
Hour | Hh | h | 时0 ~ 23 |
Minute | Mi | n | 分钟0 ~ 59 |
Second | Ss | s | 秒 0 ~ 59 |
Millisecond | Ms | - | 毫秒 0 ~ 999 |