我想按上个月的星期对数据进行排序,我寻找的是可以自动使用而无需手动编写日期的代码。
代替此:
SELECT
wadat_ist AS 'frame'
,CASE
WHEN wadat_ist BETWEEN '2019-09-01' AND '2019-09-01' THEN 'MA1'
WHEN wadat_ist BETWEEN '2019-09-02' AND '2019-09-08' THEN 'MA2'
WHEN wadat_ist BETWEEN '2019-09-09' AND '2019-09-15' THEN 'MA3'
WHEN wadat_ist BETWEEN '2019-09-16' AND '2019-09-22' THEN 'MA4'
WHEN wadat_ist BETWEEN '2019-09-23' AND '2019-09-30' THEN 'MA5'
END AS 'Activity'
我尝试过:
SELECT
wadat_ist AS 'frame'
,CASE
WHEN wadat_ist BETWEEN (SELECT (Convert (DATETIME, (SELECT DATEADD(DAY,1,EOMONTH(GETDATE(),-2)))))) AND (SELECT DateAdd (wk, 0, (select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, +0.99999)))) THEN 'MA1'
WHEN wadat_ist BETWEEN (SELECT DateAdd (wk, -4, (SELECT DATEADD(day,-1,DATEadd(MONTH,datediff(month,0,GETDATE()),0))))) AND (SELECT DateAdd (wk, 1, (select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0)))) THEN 'MA2'
WHEN wadat_ist BETWEEN (SELECT DateAdd (wk, -3, (SELECT DATEADD(day,-1,DATEadd(MONTH,datediff(month,0,GETDATE()),0))))) AND (SELECT DateAdd (wk, 2, (select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0)))) THEN 'MA3'
WHEN wadat_ist BETWEEN (SELECT DateAdd (wk, -2, (SELECT DATEADD(day,-1,DATEadd(MONTH,datediff(month,0,GETDATE()),0))))) AND (SELECT DateAdd (wk, 3, (select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0)))) THEN 'MA4'
WHEN wadat_ist BETWEEN (SELECT DateAdd (wk, -1, (SELECT DATEADD(day,-1,DATEadd(MONTH,datediff(month,0,GETDATE()),0))))) AND (SELECT DateAdd (wk, 4, (select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0)))) THEN 'MA5'
END AS 'Activity'
但是结果却大不相同。第一个星期的值在第二周,第二个星期的值在第三周,依此类推.....所有星期都以某种方式发生了变化...另外,第一个星期(MA1)被标记为NULL,但他的值应该到上个星期(MA5)。
另外,我找到了这个,但它要花上几个星期,但是随着时间的推移,它与装备周相匹配,所以也许在11月1日就可以了,但是我宁愿需要一些可以显示数据的东西一个月中的任何时间。
WHEN wadat_ist BETWEEN (select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0)) AND (select dateadd(wk, datediff(wk, 5, getdate()) - 5, 6)) THEN 'MA1'
WHEN wadat_ist BETWEEN (select dateadd(wk, datediff(wk, 4, getdate()) - 4, 0)) AND (select dateadd(wk, datediff(wk, 4, getdate()) - 4, 6)) THEN 'MA2'
WHEN wadat_ist BETWEEN (select dateadd(wk, datediff(wk, 3, getdate()) - 3, 0)) AND (select dateadd(wk, datediff(wk, 3, getdate()) - 3, 6)) THEN 'MA3'
WHEN wadat_ist BETWEEN (select dateadd(wk, datediff(wk, 2, getdate()) - 2, 0)) AND (select dateadd(wk, datediff(wk, 2, getdate()) - 2, 6)) THEN 'MA4'
WHEN wadat_ist BETWEEN (select dateadd(wk, datediff(wk, 1, getdate()) - 1, 0)) AND (SELECT EOMONTH(getdate(),-1)) THEN 'MA5'
使用T-SQL
答案 0 :(得分:1)
作为一种解决方案,您可以使用时间段在数据库或临时表中创建时间表,然后生成列WeekOfMonth:
1.至少使用这些列(日期,年,月,周,季度:使用WeekOfMonth = DENSE_RANK() OVER (PARTITION BY [year], [month] ORDER BY [week])
)创建表
2.生成您的列:
dotnet publish -f netcoreapp3.0 -c Release -o result_folder -r win-x64 --self-contained false project.csproj
如果创建一个好的时间表,它将对以后的任务很有用。
答案 1 :(得分:0)
尝试以下(部分)查询,注释为内联:
-- set monday as first day of week
set datefirst 1;
-- after checking, that 1 of september is 35th week of year, you can do the following:
select case when datepart(week, wadat_ist) = 35 then 'MA1'
when datepart(week, wadat_ist) = 36 then 'MA2'
when datepart(week, wadat_ist) = 37 then 'MA3'
when datepart(week, wadat_ist) = 38 then 'MA4'
when datepart(week, wadat_ist) = 39 then 'MA5'
end as 'Activity'
或更短
select case datepart(week, wadat_ist)
when 35 then 'MA1'
when 36 then 'MA2'
when 37 then 'MA3'
when 38 then 'MA4'
when 39 then 'MA5'
end as 'Activity'