上个月每周的数据

时间:2019-10-22 08:38:24

标签: sql sql-server tsql

我想按上个月的星期对数据进行排序,我寻找的是可以自动使用而无需手动编写日期的代码。

代替此:

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

2 个答案:

答案 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'