4.《SQLSERVER2012之T-SQL教程》T-SQL单表查询(四)

表结构与数据:https://github.com/XuePeng87/TSQLV4

日期和时间数据类型

数据类型存储(字节)日期范围精确度输入格式及示例
DATETIME8

1753年1月1日~

9999年12月13日

31/3毫秒

‘’YYYYMMDD hh:mm:ss.nnn'

'20090212 13:30:15.123'

SMALLDATETIME4

1900年1月1日~

2079年6月6日

1分钟

'YYYYMMDD hh:mm'

'20090212 12:30'

DATE3

0001年1月1日~

9999年12月31日

1天

'YYYY-MM-DD'

'2012-02-12'

TIME3~5N/A100纳秒

'hh:mm:ss.nnnnnnn‘’

'12:30:15.1234567'

DATETIME26~8

0001年1月1日~

9999年12月31日

100纳秒

‘YYYY-MM-DD hh:mm:ss.nnnnnnn’

'2009-02-12 12:30:15.1234567'

DATETIMEOFFSET8~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.当前日期和时间

函数返回类型说明
GETDATEDATETIME当前日期和时间
CURRENT_TIMESTAMPDATETIME等同于GETDATE,但遵从ANSI SQL
GETUTCDATEDATETIME当前UTC日期和时间
SYSDATETIMEDATETIME2当前日期和时间
SYSUTCDATETIMEDATETIME2当前UTC日期和时间
SYSDATETIMEOFFSETDATETIMEOFFSET包含时区偏移量的当前日期和时间
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');

 

转载于:https://my.oschina.net/u/2981366/blog/775717

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值