表结构与数据:https://github.com/XuePeng87/TSQLV4
日期和时间数据类型
数据类型 | 存储(字节) | 日期范围 | 精确度 | 输入格式及示例 |
DATETIME | 8 | 1753年1月1日~ 9999年12月13日 | 31/3毫秒 | ‘’YYYYMMDD hh:mm:ss.nnn' '20090212 13:30:15.123' |
SMALLDATETIME | 4 | 1900年1月1日~ 2079年6月6日 | 1分钟 | 'YYYYMMDD hh:mm' '20090212 12:30' |
DATE | 3 | 0001年1月1日~ 9999年12月31日 | 1天 | 'YYYY-MM-DD' '2012-02-12' |
TIME | 3~5 | N/A | 100纳秒 | 'hh:mm:ss.nnnnnnn‘’ '12:30:15.1234567' |
DATETIME2 | 6~8 | 0001年1月1日~ 9999年12月31日 | 100纳秒 | ‘YYYY-MM-DD hh:mm:ss.nnnnnnn’ '2009-02-12 12:30:15.1234567' |
DATETIMEOFFSET | 8~10 | 0001年1月1日~ 9999年12月31日 | 100纳秒 | 'YYYY-MM-DD hh:mm:ss.nnnnnnn'[+/-]hh:mm '2012-02-12 12:30:15.1234567 +02:00' |
日期和时间常量
SQL Server不提供日期和时间的常量表示方法,相反,它允许用户指定可以被隐式或显式转换为日期和时间数据类型的不同类型常量。使用字符串表示日期和时间值是最好的做法,例如:
SELECT orderid, custid, empid, orderdate
FROM Sales.Orders
WHERE orderdate = '20070212'
SQL Server将文本“20070212”识别为字符串常量,而不是日期和时间常量,但由于此表达式涉及两种类型参数,有一个隐式的类型转换,类型转换基于优先级高低,日期和时间数据类型比字符串的优先级高,所以字符串'20070212'会转换成时间类型。
注意,考虑一下常量"02/12/2007"。SQL Server可以解释日期为2007年2月12日,或2007年12月2日,设疑使用SET LANGUAGE来设置解释器,例如:
SET LANGUAGE British;
SELECT CAST('02/12/2007' AS DATETIME);
--output 2007-12-02 00:00:00.000
SET LANGUAGE us_english;
SELECT CAST('02/12/2007' AS DATETIME);
--output 2007-02-12 00:00:00.000
SET LANGUAGE设置仅影响输入值的解释方式,而输出格式是由客户端工具使用的数据库接口(如ODBC)决定的。
还可以使用CONVERT和PARSE来对日期类型进行转换,例如使用CONVERT进行转换,第三个参数是样式编号,可以通过SQL Server帮助去查看:
SELECT CONVERT(DATETIME, '02/12/2007', 101);
--output 2007-02-12 00:00:00.000
SELECT CONVERT(DATETIME, '02/12/2007', 103);
--output 2007-12-02 00:00:00.000
如果使用PARSE进行转换,则需要按照如下写法:
SELECT PARSE('02/12/2007' AS DATETIME USING 'en-US');
--output 2007-02-12 00:00:00.000
SELECT PARSE('02/12/2007' AS DATETIME USING 'en-GB');
--output 2007-12-02 00:00:00.000
独立使用日期和时间
SQL Server2008引入了独立的DATE和TIME数据类型,仅当使用DATETIME或SMALLDATETIME类型,存储的日期带有一个午夜值(时间部门为0)。
如果只使用时间部分,那么日期部分也带有一个初始值(日期部分为1900年1月1日)。
筛选日期范围
当需要筛选一个日期范围时,例如,一年或一个月,可能会很自然地使用YEAR和MONTH函数。但是,大多数情况下,在筛选列上应用操作时,SQL Server不能以有效方式使用索引。可以想下面这样修改谓词:
SELECT orderid, custid, empid, orderdate
FROM Sales.Orders
WHERE orderdate >= '20140101' AND orderdate < '20150101'
日期和时间函数
1.当前日期和时间
函数 | 返回类型 | 说明 |
GETDATE | DATETIME | 当前日期和时间 |
CURRENT_TIMESTAMP | DATETIME | 等同于GETDATE,但遵从ANSI SQL |
GETUTCDATE | DATETIME | 当前UTC日期和时间 |
SYSDATETIME | DATETIME2 | 当前日期和时间 |
SYSUTCDATETIME | DATETIME2 | 当前UTC日期和时间 |
SYSDATETIMEOFFSET | DATETIMEOFFSET | 包含时区偏移量的当前日期和时间 |
SELECT
GETDATE() AS [GETDATE],
CURRENT_TIMESTAMP AS [CURRENT_TIMESTAMP],
GETUTCDATE() AS [GETUTCDATE],
SYSDATETIME() AS [SYSDATETIME],
SYSUTCDATETIME() AS [SYSUTCDATETIME],
SYSDATETIMEOFFSET() AS [SYSDATETIMEOFFSET];
2.CAST、CONVERT和PARSE函数,及其对应的TRY_函数
- CAST(value AS datatype)
- TRY_CAST(value AS datatype)
- CONVERT(datatype,value[,styoe_number])
- TRY_CONVERT(datatype,value[,styoe_number])
- PARSE(value AS datatype [USING culture])
- TRY_PARSE(value AS datatype [USING culture])
3.SWITCHOFFSET函数
指定输入的DATATIMEOFFSET值调整为指定的时区。
SELECT SWITCHOFFSET(SYSDATETIMEOFFSET(), '-05:00');
4.TODATATIMEOFFSET函数
TODATETIMEOFFSET(date_and_time_value, time_zone)函数,第一个输入参数通常是一个不知道偏移量的日期和时间类型值,它简单地将市区偏移量与输入日期和时间合并成一个新的datetimeoffset。
5.DATEADD函数
允许为指定日期部分增加一个指定的单位数量到输入的日期和时间值中,例如为2009年2月12日增加1年:
SELECT DATEADD(year, 1, '20090212')
第一个参数值包括:year、quarter、month、dayofyear、day、week、weekday、hour、minute、second、millisecond、microsecond和nanosecond。
6.DATEDIFF函数
返回两个日期时间之间在指定日期部分的差异。例如下面两个值之间的天数差异是366:
SELECT DATEDIFF(day, '20080212', '20090212')
7.DATEPART函数
返回一个表示所请求日期和时间值部分的整数,例如,获取某一个时间的月的部分:
SELECT DATEPART(month, '20120212')
8.YEAR、MONTH和DAY函数
这三个函数是DATEPART的缩写方式。
9.DATENAME函数
返回一个代表日期和时间值部分的字符串,例如,下面的代码返回给出输入值的月名称February:
SELECT DATENAME(month, '20120212')
10.ISDATE函数
接收一个字符串输入,如果可以转换为日期类型,那么返回1,否则返回0:
SELECT ISDATE('20120212');
SELECT ISDATE('20120231');
11.FROMPARTS函数
在SQL Server2012中引入,接受代表日期和时间值各个部分的整数,并根据这些部分构件一直所请求类型的值,例如:
SELECT
DATEFROMPARTS(2012, 02, 12),
DATETIME2FROMPARTS(2012, 02, 12, 13, 30, 5, 1, 7),
DATETIMEFROMPARTS(2012, 02, 12, 13, 30, 5, 997),
DATETIMEOFFSETFROMPARTS(2012, 02, 12, 13, 30, 5, 1, -8, 0, 7),
SMALLDATETIMEFROMPARTS(2012, 02, 12, 13, 30),
TIMEFROMPARTS(13, 30, 5, 1, 7);
查询元数据
目录视图
查询数据库中的表名及其架构名称,可以查询sys.tables表:
SELECT SCHEMA_NAME(schema_id) AS table_schema_name, name as table_name
FROM sys.tables;
查询表中列的信息,可以查询sys.columns表:
SELECT
name AS column_name,
TYPE_NAME(system_type_id) AS column_type,
max_length,
collation_name,
is_nullable
FROM sys.columns
WHERE object_id = OBJECT_ID(N'Sales.Orders');
信息架构视图
信息架构视图是一个视图集合,位于INFORMATION_SCHEMA的架构中,并以标准方式提供元数据信息。例如,查询当前数据库中的用户表以及他们的架构名称:
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = N'BASE TABLE';
还可以查询列的大多数可用信息:
SELECT
COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, COLLATION_NAME, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = N'Sales' AND TABLE_NAME = N'Orders';
系统存储过程和函数
返回一个当前数据库中能够查询到的对象列表:
EXEC sys.sp_tables;
返回对象常用细腻的多个结果集,以及列、索引、约束等信息:
EXEC sys.sp_help @objname = N'Sales.Orders'
返回对象中列的信息:
EXEC sys.sp_columns @table_name = N'Orders', @table_owner = N'Sales';
返回对象中的约束信息:
EXEC sys.sp_helpconstraint @objname = N'Sales.Orders'
返回实体的属性信息:
SELECT SERVERPROPERTY('ProductLevel');
返回数据库的排序规则:
SELECT DATABASEPROPERTYEX(N'TSQLV4', 'Collation');
返回指定对象名称的所请求的属性信息:
SELECT OBJECTPROPERTY(OBJECT_ID(N'Sales.Orders'), 'TableHasPrimaryKey');
返回指定列的所请求的指定属性信息:
SELECT COLUMNPROPERTY(OBJECT_ID(N'Sales.Orders'), N'shipcountry', 'AllowsNull');