提问人:brins 提问时间:8/24/2023 最后编辑:Dale Kbrins 更新时间:8/25/2023 访问量:61
声明一个标量变量,它接受列的每一行?
Declare a scalar variable which takes in every row of a column?
问:
我想声明一个变量,它接受我的 RDD 的每一行并进行一些计算并给我一个输出。
计算将包括它将返回一周的第一天,除非 RDD 落入新的月份,否则它将返回该月的第一天。
DECLARE @tbl TABLE
(
RDD date
)
INSERT INTO @tbl
SELECT RDD
FROM tableA
DECLARE @testdate date
SELECT @testdate = RDD
FROM @tbl
SELECT
CASE
WHEN MONTH(@testdate) = MONTH(DATEADD(day, 1-DATEPART(weekday, @testdate), @testdate))
THEN DATEADD(day, 1-DATEPART(weekday, @testdate), @testdate)
ELSE DATEADD(month, DATEDIFF(month, 0, @testdate), 0)
END AS FDW,
RDD,
BPN,
FROM
tableA
WHERE
RDD IS NOT NULL
GROUP BY
RDD, BPN
我尝试了以下操作并收到了以下输出:
CD2型 | RDD型 |
---|---|
2023-08-27 00:00:00:000 | 2024-06-19 |
2023-08-27 00:00:00:000 | 2024-02-22 |
这很奇怪,因为当我执行以下命令时:
DECLARE @TESTDATE DATE = '2024-06-19'
select
case when month(@testdate) = month(dateadd(day,1-datepart(weekday,@testdate),@testdate))
then dateadd(day,1-datepart(weekday,@testdate),@testdate)
else DATEADD(month, DATEDIFF(month,0,@testdate),0)
end
我的输出是预期的 2024-06-16(一周的第一天,在我的情况下,一周从星期日开始)。
那么上面的查询有什么问题呢?为什么大小写表达式在那里不起作用?
答:
0赞
vbif
8/25/2023
#1
正如我从您的问题中可以猜到的那样,您想为表格的每个日期获取一周的第一天,但是每个月的第一天都是月初?像这样的东西?tableA
select
case
when datediff(month,lag(RDD) over (order by RDD),RDD)>0 then DATEFROMPARTS(year(RDD),month(RDD),1)
else dateadd(day,1-datepart(weekday,RDD),RDD)
end FDW,
RDD,
BPN
from
TableA
或者,也许,您需要一周的开始日期,但如果是在其他月份,查询必须返回月份开始?
select
(select max(DT) from (values(DATEFROMPARTS(year(RDD),month(RDD),1)) ,(dateadd(day,1-datepart(weekday,RDD),RDD))) SL(DT)) FDW,
RDD,
BPN
from
TableA
上一个:基于时间值提取记录
评论
scalar
GROUP BY
GROUP BY
SELECT GREATEST(DATETRUNC(month,RDD),DATETRUNC(week,RDD)) FROM TableA