《SQLSERVER2012之T-SQL教程》T-SQL單表查詢(四)

表結構與數據: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'

日期和時間函數

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');
相關文章
相關標籤/搜索