以下這段code不知為什麼撈出的資料會不一樣請各位高手指引方向幫忙分析
原始碼如下 MECHANIC_NAME 維修人員,REGISTERDATE 開單日期, PARTSTOTAL(實際更換零件 小計=零件費)
但撈出的資料3月份多出117元,5月份多出1010,350元
但直接下SQL(第二段程式碼)就無以上金額真不知是哪裡出錯了?
select t0.MECHANIC_NAME 維修人員, sum(t0.m1) as '1月',sum(t0.m2) as '2月',sum(t0.m3) as '3月',sum(t0.m4) as '4月',sum(t0.m5) as '5月'
from
(
SELECT MECHANIC_NAME
,year([REGISTERDATE]) as year
, case when month([REGISTERDATE])=1 then ([PARTSTOTAL]) else 0 end as m1 -- REGISTERDATE 開單日期, PARTSTOTAL(實際更換零件 小計=零件費)
, case when month([REGISTERDATE])=2 then ([PARTSTOTAL]) else 0 end as m2
, case when month([REGISTERDATE])=3 then ([PARTSTOTAL]) else 0 end as m3
, case when month([REGISTERDATE])=4 then ([PARTSTOTAL]) else 0 end as m4
, case when month ([REGISTERDATE])=5 then ([PARTSTOTAL]) else 0 end as m5
--, case when year ([REGISTERDATE])=2022 then ([PARTSTOTAL]) else 0 end as m5
FROM wo
) t0
where t0.year=2022
group by t0.MECHANIC_NAME
第二段程式碼
SELECT MECHANIC_NAME, PARTSTOTAL, REGISTERDATE FROM WO --PARTSTOTAL 實際更換零件 小計,REGISTERDATE 開單日期
where (REGISTERDATE) BETWEEN '20220501' AND '20220531' AND MECHANIC_NAME like N'%王賢%';
試試這個語法
SELECT MECHANIC_NAME, PARTSTOTAL, REGISTERDATE FROM WO
--PARTSTOTAL 實際更換零件 小計,REGISTERDATE 開單日期
where convert(varchar,REGISTERDATE,112) like '202205%'
--我個人習慣:日期型態的欄位,儘量用convert函數來處理
AND MECHANIC_NAME like N'%王賢%';
您好
真不懂為何同一個欄位怎麼撈出來的資料不一樣?
左邊是您那段SQL
右邊是我這段
SELECT MECHANIC_NAME, PARTSTOTAL, REGISTERDATE FROM WO --PARTSTOTAL 實際更換零件 小計,REGISTERDATE 開單日期
where (REGISTERDATE) BETWEEN '20220501' AND '20220531' AND MECHANIC_NAME like N'%王瑋賢%';
其中MECHANIC_NAME 維修人員,REGISTERDATE 開單日期, PARTSTOTAL(實際更換零件 小計=零件費)
上面結果是這段語法
下面結果是另一段語法
真不懂為何會筆數不一樣?
第一段語法
SELECT MECHANIC_NAME, PARTSTOTAL, REGISTERDATE FROM WO --PARTSTOTAL 實際更換零件 小計,REGISTERDATE 開單日期
where (REGISTERDATE) BETWEEN '20220531' AND '20220531' AND MECHANIC_NAME like N'%王瑋賢%';
第二段語法
SELECT MECHANIC_NAME, PARTSTOTAL, REGISTERDATE FROM WO
--PARTSTOTAL 實際更換零件 小計,REGISTERDATE 開單日期
where convert(varchar,REGISTERDATE,112) like '20220531'
--我個人習慣:日期型態的欄位,儘量用convert函數來處理
AND MECHANIC_NAME like N'%王瑋賢%';
試一下這個
where (REGISTERDATE) BETWEEN '20220501' AND '20220601'
差異是這三筆(時間是2022-5-31 08:00:00)
解法:
所以,我個人習慣,並不喜歡用 BETWEEN
明白了!
往後還是採用您指導的正規搜尋日期方式convert(varchar)
感謝
首先問題是在資料型別
where (REGISTERDATE) BETWEEN '20220501' AND '20220531'
REGISTERDATE 是 Datetime 型別,你用字串來作比較的時候會被轉型
convert(datetime, '20220531', 112) => 2022-05-31 00:00:00.000
然後是 BETWEEN,BETWEEN 本身沒有問題,有問題的是用的人不懂 BETWEEN 在做什麼
SELECT * FROM WO
where (REGISTERDATE) BETWEEN '20220501' AND '20220531'
及
SELECT * FROM WO
where (REGISTERDATE) >= '20220501'
AND (REGISTERDATE) <= '20220531'
兩段程式是相同的,因為 BETWEEN 等效於 x >= n1 and x <= n2
綜合上面兩點,原本的語法
SELECT MECHANIC_NAME, PARTSTOTAL, REGISTERDATE FROM WO
where (REGISTERDATE) BETWEEN '20220531' AND '20220531' AND MECHANIC_NAME like N'%王瑋賢%';
等於是
SELECT MECHANIC_NAME, PARTSTOTAL, REGISTERDATE FROM WO
where (REGISTERDATE) >= '2022-05-31 00:00:00.000'
AND (REGISTERDATE) <= '2022-05-31 00:00:00.000'
AND MECHANIC_NAME like N'%王瑋賢%';
所以 2022-05-31 08:00:00.000 的資料本來就不會被撈出來
再來下面這個語法下的條件
where (REGISTERDATE) BETWEEN '20220501' AND '20220601'
如果資料中有 2022-06-01 00:00:00.000 的資料時就會被撈出來,這會是你想要的結果嗎?
我也習慣把 datetime 轉成 varchar 來處理日期比較,但你不會一直用 like 來當比較條件,如果今天要查 2022-05-05 到 2022-05-25 的資料,like 要怎麼下?
已經有經驗的人當然可以選擇自己喜歡的方式,只要他知道自己在幹嘛就好。初學者遇到這種問題不去搞懂的話就會很難成長。
感謝您!解釋的非常清楚