SQL時間函數總結(二)

來源:互聯網
上載者:User
你可以明白,通過使用簡單的DATEDIFF和DATEADDFunction Compute,你可以發現很多不同的可能有意義的日期。
       目前為止的所有例子只是僅僅計算當前的時間和“1900-01-01”之間的時間間隔數量,然後把它加到

“1900-01-01”的時間間隔上來計算出日期。假定你修改時間間隔的數量,或者使用不同的時間間隔來調用

DATEADD函數,或者減去時間間隔而不是增加,那麼通過這些小的調整你可以發現和多不同的日期。

       這裡有四個例子使用另外一個DATEADD函數來計算最後一天來分別替換DATEADD函數前後兩個時間間隔。

上個月的最後一天

       這是一個計算上個月最後一天的例子。它通過從一個月的最後一天這個例子上減去3毫秒來獲得。有一點

要記住,在Sql Server中時間是精確到3毫秒。這就是為什麼我需要減去3毫秒來獲得我要的日期和時間。

       SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
      計算出來的日期的時間部分包含了一個Sql Server可以記錄的一天的最後時刻(“23:59:59:997”)的時

間。

去年的最後一天

       串連上面的例子,為了要得到去年的最後一天,你需要在今年的第一天上減去3毫秒。

       SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

本月的最後一天

       現在,為了獲得本月的最後一天,我需要稍微修改一下獲得上個月的最後一天的語句。修改需要給用

DATEDIFF比較當前日期和“1900-01-01”返回的時間間隔上加1。通過加1個月,我計算出下個月的第一天,然後

減去3毫秒,這樣就計算出了這個月的最後一天。這是計算本月最後一天的SQL指令碼。

       SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

本年的最後一天

       你現在應該掌握這個的做法,這是計算本年最後一天指令碼

       SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。

本月的第一個星期一

       好了,現在是最後一個例子。這裡我要計算這個月的第一個星期一。這是計算的指令碼。

         select DATEADD(wk, DATEDIFF(wk,0,                                                      

                               dateadd(dd,6-datepart(day,getdate()),getdate())), 0)              

          

       在這個例子裡,我使用了“本周的星期一”的指令碼,並作了一點點修改。修改的部分是把原來指令碼中

“getdate()”部分替換成計算本月的第6天,在計算中用本月的第6天來替換當前日期使得計算可以獲得這個月

的第一個星期一。

總結

       我希望這些例子可以在你用DATEADD和DATEDIFFFunction Compute日期時給你一點啟發。通過使用這個計算日期的

時間間隔的數學方法,我發現為了顯示兩個日期之間間隔的有用曆法是有價值的。注意,這隻是計算出這些日期

的一種方法。要牢記,還有很多方法可以得到相同的計算結果。假如你有其他的方法,那很不錯,要是你沒有,

我希望這些例子可以給你一些啟發,當你要用DATEADD和DATEDIFFFunction Compute你程式可能要用到的日期時。

---------------------------------------------------------------
附錄,其他日期處理方法

1)去掉時分秒
declare @ datetime
set @ = getdate() --'2003-7-1 10:00:00'
SELECT @,DATEADD(day, DATEDIFF(day,0,@), 0)

2)顯示星期幾
select datename(weekday,getdate())  

3)如何取得某個月的天數
declare @m int
set @m=2 --月份
select    datediff(day,'2003-'+cast(@m as varchar)+'-15' ,'2003-'+cast(@m+1    as varchar)+'-

15')

另外,取得本月天數
select    datediff(day,cast(month(GetDate()) as varchar)+'-'+cast(month(GetDate()) as

varchar)+'-15' ,cast(month(GetDate()) as varchar)+'-'+cast(month(GetDate())+1    as varchar)

+'-15')
或者使用計算本月的最後一天的指令碼,然後用DAY函數區最後一天
SELECT Day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)))

4)判斷是否閏年:
SELECT case day(dateadd(mm, 2, dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))))

when 28 then '平年' else '閏年' end
或者
select case datediff(day,datename(year,getdate())+'-02-01',dateadd(mm,1,datename(year,getdate

())+'-02-01'))
when 28 then '平年' else '閏年' end

5)一個季度多少天
declare @m tinyint,@time smalldatetime
select @m=month(getdate())
select @m=case when @m between 1 and 3 then 1
                       when @m between 4 and 6 then 4
                       when @m between 7 and 9 then 7

sql日期操作
dump transaction 資料庫 with no_log

select datename(weekday,getdate())    擷取當天的星期數
select convert(char(10),getdate(),21)

cast(@Today+' '+@DutyTime_1 as datetime) 字串組合產生時間類型

if exists(select 1 from master..sysdatabases where name='example') 判斷是否有記錄存在

cast( ltrim(str(@thisyear,4))+'-'+ltrim(str(@thismonth,2))+'-'+'21 00:00:00' as datetime)
1.一個月第一天的
Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

2.本周的星期一
Select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)

3.一年的第一天
Select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

4.季度的第一天
Select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

5.當天的半夜
Select DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

6.上個月的最後一天
Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

7.去年的最後一天
Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

8.本月的最後一天
Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

9.本年的最後一天
Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))

10.本月的第一個星期一
select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0)

返回當前日期和時間
通過函數GETDATE(),你可以獲得當前的日期和時間。函數GETDATE()可以用來作為DATEDIME型欄位的預設值。這對插入記錄時儲存當時的時間是有用的。要建立一個表,其中的記錄包含有當前的日期和時間,可以添加一個DATETIME型欄位,指定其預設值為函數GETDATE()的傳回值,就象這樣:

Create TABLE site_log (
username VARCHAR(40),
useractivity VARCHAR(100),
entrydate DATETIME DEFAULT GETDATE())

轉換日期和時間
函數GETDATE()的傳回值在顯示時只顯示到秒。實際上,SQL Sever內部時間可以精確到毫秒級(確切地說,可以精確到3.33毫秒)。
要得到不同格式的日期和時間,你需要使用函數CONVERT()。例如,當下面的這個語句執行時,顯示的時間將包括毫秒:

Select CONVERT(VARCHAR(30),GETDATE(),9)

注意例子中數字9的使用。這個數字指明了在顯示日期和時間時使用哪種日期和時間格式。當這個語句執行時,將顯示如下的日期和時間:
Nov 30 1997 3:29:55:170AM
(1 row(s) affected)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.