请教一下SQL 大神 - 有个报告需要昨天的销量。要每天运算昨天的数据 (不包含周末,只要礼拜一到五)。譬如说如果今天是礼拜四,就需要昨天礼拜三的数据。如果今天是礼拜一,需要上个礼拜五的。这样的时间段 Where cause 该怎么写: WHERE DATE BETWEEN '2022-01-01' AND ??? (DATEADD?)
回复 1楼cottonfield的帖子 you can try this method to calculate working days between 2 dates. SELECT (DATEDIFF(dd, LossDate, ClaimDate) + 1) -(DATEDIFF(wk, LossDate, ClaimDate) * 2) -(CASE WHEN DATENAME(dw, LossDate) = 'Sunday' THEN 1 ELSE 0 END) -(CASE WHEN DATENAME(dw, ClaimDate) = 'Saturday' THEN 1 ELSE 0 END) AS WorkDay_Numbers.
请教一下SQL 大神 - 有个报告需要昨天的销量。要每天运算昨天的数据 (不包含周末,只要礼拜一到五)。譬如说如果今天是礼拜四,就需要昨天礼拜三的数据。如果今天是礼拜一,需要上个礼拜五的。这样的时间段 Where cause 该怎么写: WHERE DATE BETWEEN '2022-01-01' AND ??? (DATEADD?) cottonfield 发表于 2022-10-13 22:29
因为数据库是最脆弱的环节,是最短的那块板,不要在数据库里面来做太多的判断: 1.在JAVA /Python 里面做好星期的判断,传值过来就是周一到周五 2.时间是用timestamp来存储的(是个整数),不要用 date 3.查询语句要简洁(越简洁约好,时刻牢记数据库是最短的那块板,把比较/判断全部丢给java/python里做 select col1,col2 from table1 where timestamp > ts_1 and timestamp <= ts_2 ts_1 就是对应 00:00 的 timestamp, ts_2 对应 23:59的timestamp
回复 1楼cottonfield的帖子 you can try this method to calculate working days between 2 dates. SELECT (DATEDIFF(dd, LossDate, ClaimDate) + 1) -(DATEDIFF(wk, LossDate, ClaimDate) * 2) -(CASE WHEN DATENAME(dw, LossDate) = 'Sunday' THEN 1 ELSE 0 END) -(CASE WHEN DATENAME(dw, ClaimDate) = 'Saturday' THEN 1 ELSE 0 END) AS WorkDay_Numbers.
Week_day returns day of the week. 如果是周一 这个return value is 0, 以此类推, 周六周日return value will be 5,6. 所以用 week_day(day) not in (5,6) . 不知道解释的清楚吗。 week_day usage: Definition and Usage The WEEKDAY() function returns the weekday number for a given date. Note: 0 = Monday, 1 = Tuesday, 2 = Wednesday, 3 = Thursday, 4 = Friday, 5 = Saturday, 6 = Sunday.
Week_day returns day of the week. 如果是周一 这个return value is 0, 以此类推, 周六周日return value will be 5,6. 所以用 week_day(day) not in (5,6) . 不知道解释的清楚吗。 week_day usage: Definition and Usage The WEEKDAY() function returns the weekday number for a given date. Note: 0 = Monday, 1 = Tuesday, 2 = Wednesday, 3 = Thursday, 4 = Friday, 5 = Saturday, 6 = Sunday. Ethanmom 发表于 2022-10-14 20:55
这个可以: select sum(sales), sdate from sales_table where sdate = case when datepart(weekday,CAST( GETDATE() AS Date )) =2 then dateadd(day,-3, CAST( GETDATE() AS Date )) else dateadd(day,-1, CAST( GETDATE() AS Date )) end group by sdate
这个可以: select sum(sales), sdate from sales_table where sdate = case when datepart(weekday,CAST( GETDATE() AS Date )) =2 then dateadd(day,-3, CAST( GETDATE() AS Date )) else dateadd(day,-1, CAST( GETDATE() AS Date )) end group by sdate svsun 发表于 2022-10-14 22:07
you can try this method to calculate working days between 2 dates. SELECT (DATEDIFF(dd, LossDate, ClaimDate) + 1) -(DATEDIFF(wk, LossDate, ClaimDate) * 2) -(CASE WHEN DATENAME(dw, LossDate) = 'Sunday' THEN 1 ELSE 0 END) -(CASE WHEN DATENAME(dw, ClaimDate) = 'Saturday' THEN 1 ELSE 0 END) AS WorkDay_Numbers.
因为数据库是最脆弱的环节,是最短的那块板,不要在数据库里面来做太多的判断:
1.在JAVA /Python 里面做好星期的判断,传值过来就是周一到周五
2.时间是用timestamp来存储的(是个整数),不要用 date
3.查询语句要简洁(越简洁约好,时刻牢记数据库是最短的那块板,把比较/判断全部丢给java/python里做
select col1,col2 from table1 where timestamp > ts_1 and timestamp <= ts_2
ts_1 就是对应 00:00 的 timestamp, ts_2 对应 23:59的timestamp
不是抬杠,请问一下不用写复杂query的语言是什么,我想学一下。我也经常写这些语句,总是有考虑不到的地方,然后老是要修修补补,很累。
你这说了等于没说啊, 人家问的SQL怎么做,你说需要Java/python, 好嘛你说了java/python你又不说具体怎么用这两个解决这个问题,就说了一个‘’做好星期的判断‘’,这谁能懂? 最后丢了一个巨简单的where,那是人都会啊,用你说? 你要么就继续说一下java/python怎么写,不然没有诚意
菜鸟我连SQL都写不清楚啊,哪会用JAVA/Python啊。
周末没人工作,所以1-5就可以了。
这个如果有人礼拜跑天去看报告的话,会给出空白数据吗?因为这个报告是连接Power BI autorefresh的。
谢谢mm, 可以解析一下5, 6是啥意思吗?
好高级,我试试。谢谢mm!
SQL还好。。。DAX才反人类。一个逗号隔开千位数都要写一堆。不过也许因为我是菜鸟。。。
Week_day returns day of the week. 如果是周一 这个return value is 0, 以此类推, 周六周日return value will be 5,6. 所以用 week_day(day) not in (5,6) . 不知道解释的清楚吗。 week_day usage: Definition and Usage The WEEKDAY() function returns the weekday number for a given date. Note: 0 = Monday, 1 = Tuesday, 2 = Wednesday, 3 = Thursday, 4 = Friday, 5 = Saturday, 6 = Sunday.
明白了!谢谢mm!
谢谢!我去试试看!
你的说法太武断。有些时候还真得具体情况具体分析。
SQL 是 set operation,其它程序语言是 record by record operation。从效率上讲,如果一个问题能用SQL解决,效率是最高的。
这个就要看你的 business requirement 了。比如说,一个人周末去看报告,你可以给他周五的结果啊。
对,我就是想要给周五weekday的结果,不是前一天的。