表结构与数据:https://github.com/XuePeng87/TSQLV4git
数据类型 | 存储(字节) | 日期范围 | 精确度 | 输入格式及示例 |
DATETIME | 8 | 1753年1月1日~github 9999年12月13日sql |
31/3毫秒 | ‘’YYYYMMDD hh:mm:ss.nnn'数据库 '20090212 13:30:15.123'架构 |
SMALLDATETIME | 4 | 1900年1月1日~函数 2079年6月6日工具 |
1分钟 | 'YYYYMMDD hh:mm'spa '20090212 12:30'code |
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'
函数 | 返回类型 | 说明 |
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];
指定输入的DATATIMEOFFSET值调整为指定的时区。
SELECT SWITCHOFFSET(SYSDATETIMEOFFSET(), '-05:00');
TODATETIMEOFFSET(date_and_time_value, time_zone)函数,第一个输入参数一般是一个不知道偏移量的日期和时间类型值,它简单地将市区偏移量与输入日期和时间合并成一个新的datetimeoffset。
容许为指定日期部分增长一个指定的单位数量到输入的日期和时间值中,例如为2009年2月12日增长1年:
SELECT DATEADD(year, 1, '20090212')
第一个参数值包括:year、quarter、month、dayofyear、day、week、weekday、hour、minute、second、millisecond、microsecond和nanosecond。
返回两个日期时间之间在指定日期部分的差别。例以下面两个值之间的天数差别是366:
SELECT DATEDIFF(day, '20080212', '20090212')
返回一个表示所请求日期和时间值部分的整数,例如,获取某一个时间的月的部分:
SELECT DATEPART(month, '20120212')
这三个函数是DATEPART的缩写方式。
返回一个表明日期和时间值部分的字符串,例如,下面的代码返回给出输入值的月名称February:
SELECT DATENAME(month, '20120212')
接收一个字符串输入,若是能够转换为日期类型,那么返回1,不然返回0:
SELECT ISDATE('20120212'); SELECT ISDATE('20120231');
在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');