又是乙個很常用的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
gocreate table std
(std_id varchar(4), birth datetime)
goinsert into std
select '0001' , '20010101' union all
select '0002' , '19911229' union all
select '0003' , '19810104' union all
select '0004' , '19720105'
goselect * from std
where
dateadd(year,
year(getdate())-
year(birth-10),birth)
between getdate() and getdate()+10
DNS深入學習 1
主要貢獻者包括 micha k pie jan piet mens,andrew babichev,jacob hoffman andrews,peter van dijk,nathan froyd,gene mcculley,charles henri bruyand,jose nazario,w...
sql2005時間函式
sql server中的日期與時間函式 1.當前系統日期 時間 select getdate 2.dateadd 在向指定日期加上一段時間的基礎上,返回新的 datetime 值 例如 向日期加上2天 select dateadd day,2,2004 10 15 返回 2004 10 17 00 ...
sql注入學習筆記(四)時間型盲注
時間型的注入遇到的條件更為苛刻,資料互動完成以後目標 沒有錯誤和正確的頁面回顯,這種情況我們可以利用時間函式來判斷資料有沒有在目標資料中得到執行。當然也需要構造閉合。函式 lenght 長度 ascii ascii碼 mid 擷取字串 substr 擷取字串 hex 以上在布林型中介紹過 sleep...