SQL Server取系統目前時間

來源:互聯網
上載者:User

getdate //獲得系統當前日期

datepart //擷取日期指定部分(年月日時分表)

getdate()函數:取得系統當前的日期和時間。傳回值為datetime類型的。

用法:getdate()

例子:

select getdate() as dte,dateadd(day,-1,getdate()) as nowdat

輸出結果:

dte nowdat
--------------------------- ---------------------------
1999-11-21 19:13:10.083 1999-11-20 19:13:10.083

(1 row(s) affected)

datepart()函數:以整數的形式返回時間的指定部分。

用法:datepart(datepart,date)

參數說明:datepart時要返回的時間的部分,常用取值year、month、day、hour、minute。

date是所指定的時間。

例子:

SELECT DATEPART(month, GETDATE()) AS 'Month Number'

輸出結果:

Month Number

------------

11

(1 row(s) affected)

dateadd()函數:通過給指定的時間的指定部分加上一個整數值以返回一個新時間值。

用法:dateadd(datepart,number,date)

參數說明:datepart(同上)

date(同上)

number要增加的值,整型,可正可負,正值返回date之後的時間值,負值返回date

之前的時間值

例子:

select getdate() as today

select dateadd(day,-1,getdate())

select dateadd(day,1,getdate())

輸出:

today

---------------------------

1999-11-21 19:42:41.410

(1 row(s) affected)

yesterday

---------------------------

1999-11-20 19:42:41.410

(1 row(s) affected)

tomorrow

---------------------------

1999-11-22 19:42:41.410

(1 row(s) affected)

datediff()函數:返回兩個時間以指定時間部分來計算的差值。返回整數值。如1991-6-12和1991-6-21之間以天

來算相差9天,1998-6-12和1999-6-23按年算相差1年,1999-12-1和1999-3-12按月算相差9個月

用法:datediff(darepart,date1,date2)

參數說明:datepart(同上)

date1、date2(同上date)

例子:

select datediff(month,'1991-6-12','1992-6-21') as a

輸出:

a

-----------

12

(1 row(s) affected)

SQL server2005常用的函數和分頁的幾個解決方案:

使用時間和日期的函數
getdate():擷取系統目前時間
dateadd(datepart,number,date):計算在一個時間的基礎上增加一個時間後的新時間值,比如:dateadd(yy,30,getdate())
datediff(datepart,startdate,enddate):計算兩個時間的差值,比如:datediff(yy,getdate(),'2008-08-08')
dataname(datepart,date):擷取時間不同部分的值,傳回值為字串
datepart(datepart,date):和datename相似,只是傳回值為整型
day(date):擷取指定時間的天數
month(date):擷取指定時間的月份
year(date):擷取指定時間的年份

問題1:
表A是一個不斷有新記錄增加的表,欄位t就是記錄的插入時間,現在想知道每10秒鐘插入到該表的
記錄總數大於N條的時間和記錄條數,並按由大到小的順序排序,請寫出完成該功能的SQL語句。
解決方案:
declare @t datetime
select @t=min(t) from B
select max(t) as maxT,min(t) as minT,count(*) as Num from B group by
datediff(ss,@t,t)/10 having count(*)>1 order by count(*) desc

全域變數:
以@@開頭,且不能由使用者自訂,下面來看幾個常用的全域變數:
@@rowcount :表示最近一個語句影響的行數。
@@error:上一條sql語句返回的錯誤資訊。
@@identity:對有識別欄位的表而言,系統會為表每產生一個新的標識號,這個變數記錄的就是最近產生的id。

rowcount:會話級全域變數,比如set rowcount 3 ,就是設定返回的記錄數最多是3條,此變數的作用類似於
top子句,TOP 子句適用於指定了該子句的單個 SELECT 語句。SET ROWCOUNT 將一直有效,直到執行另一個
SET ROWCOUNT 語句,例如 SET ROWCOUNT 0 將關閉該選項。

indetity_insert:會話級全域變數
任何時候,一個會話中只有一個表的 IDENTITY_INSERT 屬性可以設定為 ON。如果某個表已將此屬性設
置為 ON,則對另一個表發出 SET IDENTITY_INSERT ON 語句時,SQL Server 2005 將返回一個錯誤資訊,
指出 SET IDENTITY_INSERT 已設定為 ON,並報告已將其屬性設定為 ON 的表。
如果插入值大於表的當前標識值,則 SQL Server 自動將新插入值作為當前標識值使用。
SET IDENTITY_INSERT 的設定是在執行或運行時設定的,而不是在分析時設定的。
dbcc checkident (table_name,reseed,n):此語句的功能是更正列的當前標識值,把table_name的標
識符設定為n。如果當識別欄位中存在 PRIMARY KEY 或 UNIQUE 約束時,無效標識資訊會導致錯誤訊息 2627。

SQL Server的幾個分頁解決方案:
解決方案1:
declare @pageIndex int,@pageSize int,@recordNum int
set @pageIndex=3
set @pageSize=3
select top(@pageSize) * from Grade where id not in (select top
((@pageIndex-1)*@pageSize) id from Grade)//顯示出第 7 到 第 9 條

select @recordNum=count(*) from Grade//顯示總記錄數

點評:效率不高,而且取出來的資料是按id排序的。如果想按其他欄位排序就不行。

解決方案二:
declare @id int
--set rowcount 3
--select @id=id from Grade
select top 3 @id=id from Grade//這句等效於上面注視的兩句
select top 3 * form Grade where id>@id//查詢出第 4 到第 6 條記錄

點評:效率比方案一稍高,但是取出來的資料是也按id排序的。如果想按其他欄位排序就不行

解決方案三:
create table #table(new_id int identity(1,1) primary key,id int)
insert into #table(id) select id from grade
select a.* from grade a join #table b on (b.new_id between 6 and 9) and a.id=b.id
//取出第 6 到第 9 條,
點評:其原理是把要分頁的表的主鍵插入到暫存資料表中,暫存資料表的欄位就是一個識別欄位和要分
頁的表的主鍵列(包括是多個主鍵的情況,上面的兩種方法就不行)。特點是效率高,取出
來的資料能根據自己要求的欄位排序。

暫存資料表:
上面的解決方案三就是使用了暫存資料表,它與永久表相似,但暫存資料表儲存在 tempdb 中,當不
再使用時會自動刪除。
暫存資料表有兩種類型:本地和全域。它們在名稱、可見度以及可用性上有區別。本地暫存資料表
的名稱以單個數字記號 (#) 打頭;它們僅對當前的使用者串連是可見的;當使用者從 SQL Server
執行個體中斷連線時被刪除。全域暫存資料表的名稱以兩個數字記號 (##) 打頭,建立後對任何使用者
都是可見的,當所有引用該表的使用者從 SQL Server 中斷連線時被刪除。

表級變數:
象上面分頁的例子也可以使用表級變數,象下面這樣:

declare @table table (newid int identiey(1,1),id int)
insert into @table(id) select id from grade
select a.* from grade a join @table b on (b.new_id between 6 and 9) and a.id=b.id
這種方式比使用暫存資料表分頁效率更高。

字串函數:
left(stringExp,intExp):取字串左邊多少個字元
len(strExp):計算指定字串的長度
char(intExp):根據指定字元的ASCII碼返回相應的字元
ascii(strExp):將一個字元轉換成相應的ascii碼
lower(strExp):將字串轉換為小寫
Upper(strExp):將字串轉換為大寫
Ltrim(strExp):去字串左邊的空格
rtrim(strExp):去字串右邊的空格
substring(strExp,intExp,intExp):按指定的索引截取一個字串的子字串
replace(strExp,strOldStr,strNewStr):將字串中的部分內容用新的字串來代替

系統其他轉換函式:
isnull(邏輯運算式,代替值):判斷邏輯運算式是否為null,是的話就用指定的值代替。
convert()和cast:
CAST 函數和 CONVERT 函數還可用於擷取各種特殊資料格式,並可用於挑選清單、WHERE
子句以及允許使用運算式的任何位置中。如果希望 Transact-SQL 程式碼符合 SQL-92,
請使用 CAST 而不要使用 CONVERT。如果要利用 CONVERT 中的功能,請使用 CONVERT
而不要使用 CAST。
使用 CAST 或 CONVERT 時,需要提供以下資訊:
要轉換的運算式;例如,銷售報告要求銷售資料從貨幣資料轉換為字元資料。
要將指定的運算式轉換為的資料類型,例如 varchar 或其他 SQL Server 系統資料類型。
除非將被轉換的值儲存起來,否則轉換僅在 CAST 函數或 CONVERT 函數的作用時間範圍內有效。
如果轉換時沒有指定資料類型的長度,則 SQL Server 自動將 30 作為長度值。

問題:
有一張商品表,裡面三個欄位:購買日期,購買人,價格。現在要統計每個購買人每一
季度的消費總價,並算出小計(也就是這一年消費的總價)

解決方案:

建立一張shop表:
create table shop
(
selldate datetime default(getdate()),
name varchar(20),
price money,
)
加入一些測試資料:
insert into shop(selldate,name,price) values('2006-05-12','張三',75)
insert into shop(selldate,name,price) values('2006-07-12','張三',50)
insert into shop(selldate,name,price) values('2006-09-12','張三',43)
insert into shop(selldate,name,price) values('2006-11-12','李四',67)
insert into shop(selldate,name,price) values('2006-01-12','李四',98)
insert into shop(selldate,name,price) values('2006-06-12','李四',100)
insert into shop(selldate,name,price) values('2006-08-12','王五',134)
insert into shop(selldate,name,price) values('2006-04-12','王五',165)
insert into shop(selldate,name,price) values('2006-10-12','王五',85)
insert into shop(selldate,name,price) values('2006-08-12','趙六',11)
insert into shop(selldate,name,price) values('2006-12-12','趙六',165)
insert into shop(selldate,name,price) values('2006-02-12','趙六',17)
insert into shop(selldate,name,price) values('2006-01-12','趙六',198)

select * from shop

解決問題的select語句:
select name 姓名,
sum(case when datepart(q,selldate)=1 then price else 0 end) 第一季度,
sum(case when datepart(q,selldate)=2 then price else 0 end) 第二季度,
sum(case when datepart(q,selldate)=3 then price else 0 end) 第三季度,
sum(case when datepart(q,selldate)=4 then price else 0 end) 第四季度,
sum(price) 小計
from shop group by name

===================================
時間轉換問題

資料庫段有一項為time欄位,類型為日期/時間,我有以下SQL語句取系統目前時間插入:
strSQL="insert into bbs (title,name,text,[time]) values("+TextBox1.Text+","+TextBox2.Text+","+TextBox3.Text+",datename(year,getdate();))";

總是提示時間轉換出錯。請問時間轉換的參數是如何,如何是寫這一語句!

NO.1 作者: lansluo

直接用getdate()方法擷取系統目前時間

NO.2 作者: lansluo

strSQL="insert into bbs (title,name,text,[time]) values("+TextBox1.Text+","+TextBox2.Text+","+TextBox3.Text+",getdate())";

這樣就可以了。

NO.3 作者: ddangerous169

你為什麼還要加引號呢?直接用就OK啦
strSQL="insert into bbs (title,name,text,[time]) values("+TextBox1.Text+","+TextBox2.Text+","+TextBox3.Text+",getdate)";

NO.4 作者: vzxq

string news_date=DateTime.Now.ToShortDateString();

NO.5 作者: thinkingforever

strSQL="insert into bbs (title,name,text,[time]) values("+TextBox1.Text+","+TextBox2.Text+","+TextBox3.Text+",year(getdate()))";

【reprinted from http://hi.baidu.com/kaisep/blog/item/4c70dcce49ae540592457e82.html 3Q】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.