iT邦幫忙

0

SQL指令+變數該如何寫?

XYZ 2019-06-05 10:48:351440 瀏覽

使用者選2019年1月則資料要找前一個月也就是2018年12月的資料,
若選擇2019年2月則資料要找前一個月也就是2019年1月的資料,
若選擇2019年3月則資料要找前一個月也就是2019年2月的資料,
假設日期的欄位是date2的變數是#yearmonth#,
SQL指令要如何寫?

MSSQL資料結構如下
https://ithelp.ithome.com.tw/upload/images/20190605/20108157KhOcjYiPmI.png

假設指令如下,要如何修改?
輸入的變數年的變數設為#year#,月的變數設為#month#

使用者只能選當年度當月的條件,
也就是#year#和#month# ,報表資料某些要抓#year#和#month# 的資料也是當年度當月的資料,報表的某些資料要抓上個月的資料,但下面SQL指令可以抓上個月的資料,但跨年度不知如何下SQL指令?

select name,id,sum(momey)
from a
where date2 like '#year#-<<ToText(ToNumber(#month#)-1,"00")>>%'
group by name,id

若選使用者選2019年1月則資料要找前一個月也就是2018年12月的資料如下
https://ithelp.ithome.com.tw/upload/images/20190605/20108157zKLwMaWXCn.png

若選擇2019年2月則資料要找前一個月也就是2019年1月的資料如下
https://ithelp.ithome.com.tw/upload/images/20190605/201081577vXDSvVV0c.png

看更多先前的討論...收起先前的討論...
石頭 iT邦研究生 2 級 ‧ 2019-06-05 11:04:38 檢舉
你使用哪個DBMS?
yi741963 iT邦新手 5 級 ‧ 2019-06-05 11:04:46 檢舉
Oracle:
add_months(輸入日期,-1)
T-SQL:
dateadd(month, -1, 輸入日期)
你應該是使用Access DB的SQL吧?
話說要看你的測試資料的內容~才能決定哪種適合的語法~
XYZ iT邦新手 5 級 ‧ 2019-06-05 11:45:07 檢舉
我用MSSQL
ccutmis iT邦高手 8 級 ‧ 2019-06-05 12:59:27 檢舉
網路搜的參考看看...
https://stackoverflow.com/questions/3833352/declare-variable-for-a-query-string
1
海綿寶寶
iT邦大神 1 級 ‧ 2019-06-05 12:24:13

使用者選2019年1月

使用者應該不會「直接」下 SQL 指令吧

與其想「怎麼下 SQL 指令」
或許可以換個做法
去修改「讓使用者選年月的程式」
也就是「實際下 SQL 指令的程式」
在「程式端」做日期的轉換(201902->201901, 201901->201812)
最後「下 SQL 指令」時就簡單直覺了

XYZ iT邦新手 5 級 ‧ 2019-06-05 13:31:22 檢舉

使用者只能選當年度當月的條件,
也就是#year#和#month# ,報表資料某些要抓#year#和#month# 的資料也是當年度當月的資料,報表的某些資料要抓上個月的資料,但下面SQL指令可以抓上個月的資料,但跨年度不知如何下SQL指令?

select name,id,sum(momey)
from a
where date2 like '#year#-<<ToText(ToNumber(#month#)-1,"00")>>%'
group by name,id

1
小魚
iT邦大師 1 級 ‧ 2019-06-05 13:52:56

不論是後端程式或是SQL,
都有DateTime格式,
只要利用它的函式減1個月就可以,
不需要自己處理.

看更多先前的回應...收起先前的回應...
XYZ iT邦新手 5 級 ‧ 2019-06-05 14:00:20 檢舉

若選2019-01,我寫的SQL變數變為2019-00,您說的利用它的函式是什麼?

slime iT邦大師 1 級 ‧ 2019-06-05 14:12:09 檢舉

把輸入 y = 2019 , m = 1 , 用函式轉為 2019/01/01 (或 2019/01/01 00:00:00 ) 的 DateTime 變數 (或 TimeSerial 變數) ,

再把剛剛取得的 DataTime 變數, 用 day - 1 或 month -1 , 算出 2018/12/31 或 2018/12/01 ,

再把算出來的 2018/12/31 或 2018/12/01 , 用 year 或 month 算出 y' = 2018 , m' = 12 .

小魚 iT邦大師 1 級 ‧ 2019-06-05 16:24:21 檢舉

語法

SELECT CONVERT(VARCHAR(6), DATEADD(MONTH,-1,'2010-01-01'), 112);

結果

200912

看不懂的話請上網查關鍵字.

小魚 iT邦大師 1 級 ‧ 2019-06-05 16:39:18 檢舉

再包一層

SELECT SUBSTRING(time, 1, 4) + '-' + SUBSTRING(time, 5, 2) AS last_month FROM (
SELECT CONVERT(VARCHAR(6), DATEADD(MONTH,-1,'2010-01-01'), 112) AS time
)AS root

結果

2009-12

不知道有沒有比較簡單的寫法...

0
舜~
iT邦好手 1 級 ‧ 2019-06-05 15:20:56

減少一個月的幾種語法

SELECT GETDATE() 'Today', DATEADD(month,-1,GETDATE()) 'Today - 1 Months'
SELECT GETDATE() 'Today', DATEADD(mm,-1,GETDATE()) 'Today - 1 Months'
SELECT GETDATE() 'Today', DATEADD(m,-1,GETDATE()) 'Today - 1 Months'

組合成您需要的格式

SELECT FORMAT(DATEADD(m,-1,convert(datetime, '20161001')) ,'yyyy-MM')

最後結果

select name,id,sum(momey)
from a
where date2 = FORMAT(DATEADD(m,-1,convert(datetime, '#year#-<<ToText(ToNumber(#month#)-1,"00")>>')) ,'yyyy-MM')
group by name,id

剩下的大大應該可以自己解決了~~

小魚 iT邦大師 1 級 ‧ 2019-06-05 16:28:05 檢舉

你確定 FORMAT 是 MS-SQL 的嗎?
我試起來不行...

小魚 iT邦大師 1 級 ‧ 2019-06-05 16:54:47 檢舉

啊好像是2012開始可以,
我的是2008的...

我要發表回答

立即登入回答