2017-05-02 1 views
1

나는 만료 날짜 시간 열이있는 수백 개의 레코드를 가지고 있습니다. 이런 식으로 뭔가 :시간에 따라 데이터베이스 테이블을 지속적으로 업데이트하는 방법은 무엇입니까?

Name   Expires    Status 
-----------+---------------------+--------+ 
Apple1  2017-05-05 10:10:15 Live 
Apple2  2017-06-01 18:15:03 Live 
Apple3  2017-01-01 23:59:59 Dead 
Apple4  2017-01-30 23:00:01 Draft 
Apple5  2017-01-30 23:00:01 Queued 

내가 만료 날짜가 경과 한 후 Live 어떤 레코드의 상태를 변경하고 싶습니다.

은 지금까지 나는이 가능한 솔루션에 대한 생각 :

  1. 초마다
  2. 모든 페이지 요청에 응용 프로그램 서버를하기 (ColdFusion 2016)를 사용하여 수행 일부 업데이트 스크립트를 실행하기 위해 SQL 서버 작업을 설정 . 따라서 페이지가 요청 될 때마다 응용 프로그램의 onRequestStart() 메소드에서이 업데이트 스크립트를 실행합니다.

둘 다 조금 "웹 1.0"으로 보일 수 있으며 비용이 매우 많이 든다. 나는 정확한 시간이 도착하자 마자 페이스 북이 예정된 게시물을 게시 할 때 페이스 북이하는 일을하려고 노력하고있는 것 같지만 효율적으로 처리 할 수는 없다.

누구든지이 목표를 달성하기위한 좋은 방법을 제안 할 수 있습니까?

+6

왜 업데이트해야합니까? sysdatetime과 비교하여 datetime을 확인하십시오 (동기화 중이거나 실제 dt가 중요한 것을 기반으로한다고 가정). 지속적으로 테이블을 업데이트하는 대신 논리적으로 상태를 확인하십시오. Expires dt를 얻기 위해 테이블을 쿼리해야 할 것입니다.이 시점에서 만료되었는지 여부를 알 수 있습니다. 따라서 열을 업데이트하여 일부 로직을 읽거나 사용할 필요가 없습니다. 그냥 사용하십시오. 논리로서의 dt 자체 – scsimon

+0

@scsimon 때때로 사람들은 수동으로 일찍 레코드를 만료하기를 원하기 때문에. 따라서 응용 프로그램에는 레코드를 만료 할 수있는 옵션이 있습니다. 따라서 레코드가 실제로 작동하는지 또는 작동하지 않는지를 결정하는 방법으로 날짜 비교를 수행하면 작동하지 않습니다. –

+0

괜찮습니다. 다만 IF 검사 일뿐입니다. 가짜 :'If (Status = 'Dead'또는 Expires scsimon

답변

4

나는

SELECT 
    [Name] 
    ,[Expires] 
    ,CASE 
     WHEN GETUTCDATE() > [Expires] THEN 'Dead' 
     ELSE [Status] 
     END AS [view_Status] 
FROM Table 

의 라인을 따라 뷰를 사용하거나 같은 일을 상태 열에 계산 된 열을 사용하는 것 중 하나. 어느 쪽이든, 그것이 만료되면 '죽은 자'로 표시되고, 그렇지 않으면 상태 열을 가져옵니다.

관련 문제