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