SQL深入學習(1)--時間函數

又是一個很常用的SQL語句
數據庫會員表的datetime字段(字段名birth)存的日期格式是 yy--mm--dd
現在我想列出近10天過生日的會員,sql語句要怎麼寫?

這還不容易,很容易就想到
select * from table where birth between  GETDATE() and GETDATE()+10
GETDATE()返回當前的時間,是DATETIME型

哦,有漏洞了,birth應該轉換到當前的年份,不然是查詢不出來的
select * from table
where DATEADD(YEAR,YEAR(GETDATE())-YEAR(birth),birth)
between  GETDATE() and GETDATE()+10
DATEADD()在給定的一個時間上,加上指定的時間量,如10分鐘,3天等,返回DATETIME型
YEAR則是返回給定時間的年份,INT型

貌似不錯,測試一下,還有問題,如果當前日期是2004-12-27,這種算法會忽略掉2005-1-*過生日的人

繼續修改,上面算法的主要問題出在DATEADD,1981-12-29出生的人和1981-1-1出生的人ADD的值應該是不一樣的,這個值是一個變量,那麼就在這個值上面動腦筋,YEAR(GETDATE())-YEAR(birth-10)就好了,於是
select * from table
where DATEADD(YEAR,YEAR(GETDATE())-YEAR(birth-10),birth)
between  GETDATE() and GETDATE()+10
測試一下,ok,perfect了。

看來,就算是看似如此簡單的語句,還是有陷阱的。這個題目的陷阱就是跨年的問題。

附:
USE tempdb
GO
CREATE TABLE std
(std_id  VARCHAR(4),    birth DATETIME)
GO
INSERT INTO std
SELECT '0001'  ,     '20010101'    UNION ALL
SELECT '0002'  ,     '19911229'      UNION ALL
SELECT '0003'  ,     '19810104'    UNION ALL
SELECT '0004'  ,     '19720105'
GO
select * from std
where DATEADD(YEAR,YEAR(GETDATE())-YEAR(birth-10),birth)
between  GETDATE() and GETDATE()+10
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章