iT邦幫忙

0

請問SQL查詢單月資料語法

ltc09 2014-03-07 09:08:5018156 瀏覽

平常我的寫法:
付款日期 BETWEEN " & 單月第1日 & " AND " & 單月最後日

請問有比較簡單的寫法嗎?
可以用(年+月)查詢嗎?

看更多先前的討論...收起先前的討論...
ezdoc iT邦新手 2 級 ‧ 2014-03-10 14:56:29 檢舉
小弟以為用 between 是最好的寫法, 條件欄位在where 中做運算,會影響查詢效能。
下圖是小弟在一個有 110萬筆資料的測試結果。
進行三個測試,db 是 sql2005, 日期欄位有建索引,指令分別為

1. SELECT * FROM Tbl WHERE IODate BETWEEN '2013-1-1' AND '2013-1-31'
2. SELECT * FROM Tbl WHERE convert(varchar(7), IODate, 120) = '2013-01'
3. SELECT * FROM Tbl where year(IODate) = 2013 and month(IODate) = 01

查詢速度 1 >> 3 >> 2

wonton iT邦高手 6 級 ‧ 2014-03-10 15:42:28 檢舉
不知道用 like 花費的時間如何 XD
ltc09 iT邦研究生 5 級 ‧ 2014-03-10 18:20:42 檢舉
所以1最快嗎?
還是2?
ltc09 iT邦研究生 5 級 ‧ 2014-03-10 18:21:32 檢舉
我也想知道 like 時間
感恩
外獅佬 iT邦大師 1 級 ‧ 2014-03-11 00:08:11 檢舉
BETWEEN的效能,遠不如<= + >=
外獅佬 iT邦大師 1 級 ‧ 2014-03-11 00:11:19 檢舉
SELECT * FROM Tbl WHERE IODate>= '2013-01-01' AND IODate<='2013-01-31'
ezdoc iT邦新手 2 級 ‧ 2014-03-11 11:50:04 檢舉
wiselou 說的沒錯, 用 <= and >= 效能最好。MS SQL 似乎必須要 date 轉成 字串才能 like, 我試不出 date 直接 like 的語法汗。但這樣轉換再 like, 效能卻是最差的。
player iT邦大師 1 級 ‧ 2014-03-13 20:17:22 檢舉
用SQL Server就別把日期欄位轉字串啊
直接用日期的相關函數, 直接取出 年, 月, 日 出來作為篩選條件
會比先轉字串再 like 快很多 (因為這些系統函數只做了遮罩與位移, 就直接轉成整數了)
10
魯大
iT邦高手 1 級 ‧ 2014-03-07 10:01:56
最佳解答

如果你的付款日期欄位的格式為YYYYMMDD,且為文字格式
那也可以用以下方式

&lt;pre class="c" name="code">付款日期 like 'YYYYMM%'
YYYY指西元年
MM指月
ltc09 iT邦研究生 5 級 ‧ 2014-03-10 12:12:17 檢舉

我自己最後是採用這個語法
我的資料欄位是DATE
不過要修正一下 付款日期 like 'YYYY\MM\%'

8
何必問
iT邦好手 1 級 ‧ 2014-03-07 10:12:45

MSSQL 可以參考 DATEPART

6
wonton
iT邦高手 6 級 ‧ 2014-03-07 11:29:14

也可以使用

&lt;pre class="c" name="code">convert(varchar(7), &lt;date_field>, 120) = 'YYYY-MM'

不過好像沒有比較簡單~~ 逃跑

6
player
iT邦大師 1 級 ‧ 2014-03-07 19:13:37

where year(日期欄位) = @year and month(日期欄位) = @month

這樣也可以在SQL Server指定年月做為篩選條件

0
hisniper
iT邦新手 2 級 ‧ 2014-03-10 08:51:12

若該欄為字串型態
where left(付款日期,7)='2014-01'

若該欄為datetime型態
where year(付款日期)=2014 and month(付款日期)=1

ps.這答案,應該全面的高手都有回答過了 ^.^

0
daniel929
iT邦新手 4 級 ‧ 2014-03-10 09:05:12

可以參考保哥的資料

你應該是想抓每個月的資料吧

所以每個月你可以下這個語法,不用去指定年月

SELECT *
FROM TABLE_NAME
WHERE xxx BETWEEN DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
AND DATEADD(mm, 1, DATEADD(dd, -1, DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)))

0
CLF
iT邦新手 4 級 ‧ 2014-03-10 10:13:25

select convert(char(6) ,GETDATE() ,112)
這是我目前用起來最短的抓年月 的方法..
不知道是不是還有更短的...

供參考~

我要發表回答

立即登入回答