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
數據庫會員表的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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.