使用者選2019年1月則資料要找前一個月也就是2018年12月的資料,
若選擇2019年2月則資料要找前一個月也就是2019年1月的資料,
若選擇2019年3月則資料要找前一個月也就是2019年2月的資料,
假設日期的欄位是date2的變數是#yearmonth#,
SQL指令要如何寫?
MSSQL資料結構如下
假設指令如下,要如何修改?
輸入的變數年的變數設為#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月的資料如下
若選擇2019年2月則資料要找前一個月也就是2019年1月的資料如下
減少一個月的幾種語法
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
剩下的大大應該可以自己解決了~~
使用者選2019年1月
使用者應該不會「直接」下 SQL 指令吧
與其想「怎麼下 SQL 指令」
或許可以換個做法
去修改「讓使用者選年月的程式」
也就是「實際下 SQL 指令的程式」
在「程式端」做日期的轉換(201902->201901, 201901->201812)
最後「下 SQL 指令」時就簡單直覺了
不論是後端程式或是SQL,
都有DateTime格式,
只要利用它的函式減1個月就可以,
不需要自己處理.
把輸入 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 .
語法
SELECT CONVERT(VARCHAR(6), DATEADD(MONTH,-1,'2010-01-01'), 112);
結果
200912
看不懂的話請上網查關鍵字.
再包一層
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
不知道有沒有比較簡單的寫法...