英文:
SQL stored procedure to determine age and changing the value of a row in another table depending upon the age
问题
这是前一个问题的继续链接。
所以我有一个名为GenericAttribute的表,其中包含以下值:
| Id | KeyGroup | Key | Value | 
|---|---|---|---|
| 28 | Customer | DateOfBirth | 26-01-2000 | 
| 29 | Customer | DateOfBirth | 26-01-2020 | 
| 30 | Customer | CountryPage.HideStatesBlock | FALSE | 
我有另一个名为RoleMapper的表,它根据客户的ID将其映射到其角色ID。GenericAttribute中的Id是从RoleMapper表的CustomerID列派生的外键,如下所示。
| CustomerID | CustomerRoleId | 
|---|---|
| 28 | 58 | 
| 29 | 27 | 
我的意图是创建一个SQL代理作业,其中包含一个存储过程,如果客户今天年龄超过60岁,将RoleMapper表的值更新为24。触发器必须每天激活一次。
我正在使用SQL Server。
我尝试使用基于我以前问题中给出的答案的此查询。
select [id] from [Genericattribute]
where [key] = 'DateOfBirth'
  and right(value,5)=format(getdate(),'MM-dd')
虽然我能够得到今天生日的人的答案,但当有多人在同一天过生日时,即使在使用表数据类型后,我也无法继续。
英文:
This is a continuation of the previous question here.
So I have a table named GenericAttribute which has some values like this:
| Id | KeyGroup | Key | Value | 
|---|---|---|---|
| 28 | Customer | DateOfBirth | 26-01-2000 | 
| 29 | Customer | DateOfBirth | 26-01-2020 | 
| 30 | Customer | CountryPage.HideStatesBlock | FALSE | 
I have another table named RoleMapper that maps a customer based on their ID to their role ID. The Id in the GenericAttribute is the Foreign Key which originates from the CustomerID column of the RoleMapper table, below.
| CustomerID | CustomerRoleId | 
|---|---|
| 28 | 58 | 
| 29 | 27 | 
My intention is to create a SQL agent job with a stored procedure that updates the RoleMapper table value to 24, if a customer's age is more than 60, today. The trigger must be activated once a day.
I am using SQL Server.
I tried using this query based on the answer given in my previous question.
select [id] from [Genericattribute]
where [key] = 'DateOfBirth'
  and right(value,5)=format(getdate(),'MM-dd')
Though I was able to get an answer to whose birthday was today, when more than one people had their birthdays on the same day, I was unable to proceed even after using a table data type.
答案1
得分: 1
尝试使用以下查询安排 SQL Server 代理作业:
-- 旧查询
-- DECLARE @Today Date = GETDATE();
;
WITH CTE AS
(
    SELECT *, RIGHT(value, 4) + '-' + SUBSTRING(value, 4, 2) + '-' + LEFT(value, 2) AS [Date]
    FROM GenericAttribute
    WHERE [key] = 'DateOfBirth'
)
UPDATE RoleMapper
SET CustomerRoleId = 24
FROM RoleMapper RoleMapper
JOIN CTE ON CTE.ID = RoleMapper.CustomerID
WHERE DATEDIFF(YEAR, [Date], @Today) > 60
    OR (DATEDIFF(YEAR, [Date], @Today) = 60 AND MONTH(@Today) >= MONTH([Date]) AND DAY(@Today) >= DAY([Date]));
DECLARE @Today Date = GETDATE();
;
WITH CTE AS
(
    SELECT *
    FROM GenericAttribute
    WHERE [key] = 'DateOfBirth'
)
SELECT *
FROM RoleMapper RoleMapper
JOIN CTE ON CTE.ID = RoleMapper.CustomerID
WHERE DATEDIFF(YEAR, value, @Today) > 60
    OR (DATEDIFF(YEAR, value, @Today) = 60 AND MONTH(@Today) >= MONTH(value) AND DAY(@Today) >= DAY(value));
英文:
Try Schedule a SQL server agent job with the below query
--OLD QUERY
  --DECLARE @Today Date=GETDATE()
        	
  --      	;WITH CTE
  --      	AS
  --      	(	
  --      		SELECT	*,RIGHT(value,4)+'-'+SUBSTRING(value,4,2)+'-'+LEFT(value,2)[Date]
  --      		FROM	GenericAttribute
  --      		WHERE	[key] = 'DateOfBirth'
  --      	)
  --      	UPDATE	RoleMapper
  --      	SET		CustomerRoleId=24 
  --      	FROM	RoleMapper RoleMapper
  --      	JOIN	CTE
  --      		ON	CTE.ID =RoleMapper.CustomerID
  --      	WHERE	DATEDIFF(YEAR,[Date],@Today)>60 
  --      		OR (DATEDIFF(YEAR,[Date],@Today)=60 AND MONTH(@Today)>=MONTH([Date]) AND DAY(@Today)>=DAY([Date]))
			
			DECLARE @Today Date=GETDATE()
        	
        	;WITH CTE
        	AS
        	(	
        		SELECT	* 
        		FROM	GenericAttribute
        		WHERE	[key] = 'DateOfBirth'
        	)
        SELECT *
        	FROM	RoleMapper  RoleMapper
        	JOIN	CTE
        		ON	CTE.ID =RoleMapper.CustomerID
        	WHERE	DATEDIFF(YEAR,value,@Today)>60 
        		OR (DATEDIFF(YEAR,value,@Today)=60 AND MONTH(@Today)>=MONTH(value) AND DAY(@Today)>=DAY(value))
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论