MySQL에서 현재 타임스탬프 내에 10분 이내인 모든 레코드를 선택하는 방법은 무엇입니까?
다음과 같은 "last_seen"이라는 테이블 열에 타임스탬프가 있습니다.
2012-01-25 18:46:42
2012-01-23 08:19:04
2012-01-23 08:19:04
etc...
타임스탬프가 현재 타임스탬프로부터 10분 이내에 있는 모든 레코드를(가장 효율적인 방법으로) 얻으려면 어떻게 해야 합니까?
가장 효율적인 방법은 타임스탬프를 모든 행에 대해 상수로 계산할 수 있는 식과 비교하는 것입니다. 이렇게 하면 mysql이 타임스탬프 열에 정의된 인덱스를 사용할 수 있습니다.
SELECT * FROM myTable
WHERE last_seen >= NOW() - INTERVAL 10 MINUTE
언제든지 시도할 수 있습니다.EXPLAIN SELECT ...
표의 모든 행을 확인할 필요 없이 색인을 사용하여 WHERE 조건을 만족하는 행을 찾을 수 있는지 확인합니다.
질문하신 내용은 현재 타임스탬프 후 10분 이내의 기록을 요구하지만, 과거(미래가 아닌)에는 10분 이내의 기록을 요구합니다.
SELECT col1, col2, col3
FROM table
WHERE DATE_ADD(last_seen, INTERVAL 10 MINUTE) >= NOW();
이것은 10분을 더하는 것입니다.last_seen
그리고 그것을 현재의 시간과 비교합니다.값이 더 크면,last_seen
10분도 안 됐어요
사용 방법에 대한 설명은 의 설명서를 참조하십시오.
그 방법이 누군가에게 효과가 없었을 경우.
위 답변의 'where' 조건은 날짜() 함수 안에 타임스탬프 열을 추가하기 전에는 작동하지 않았습니다(@karam qubsi에서 제안).
선택 * 내 테이블에서
WHERE 날짜(마지막_본) >= NOW() - 인터벌 10분
그제서야 정확한 결과를 얻기 시작했습니다.
질문을 한 개의 테이블 이상으로 확장하고 date_modified된 데이터베이스의 모든 테이블에서 마지막 5분 이내에 항목을 찾으려면 이 스크립트를 사용해 보십시오.
데이터베이스에 대한 항목을 조정하고(mgmt2go라는 데이터베이스를 사용했습니다) 아래 파일을 실행 가능한 .sql 파일에 저장합니다.
상황에 맞게 원하는 대로 적용하되, 데이터베이스 설정만 변경하면 데이터베이스에 대해서도 동일하게 됩니다.
MySQL(실제 MariaDB) 데이터베이스에 모든 설정을 쓰는 시스템을 디버깅할 때 출력을 참조할 수 있도록 명령줄에서 이 SQL 스크립트를 실행하고 결과를 파일로 출력합니다.시스템 사용자 인터페이스를 통해 변경할 때 어떤 영향을 받고 있는지 파악해야 했습니다.
# For this setup, it is best to send the output to a file
# and then read the file to see what records in what tables are found
# Save this file as list_tables.sql (or whatever you want to save it as)
# and use it by entering, at the CLI
# mysql --user=UserName --password=UserPassword -vv 2>&1 < path_to_executable_file/list_tables.sql > path_to_output_file/test.output.txt
# If you want the filename to include the time period,
# concatentate the bash date function with the filename
# ie: "mgmt2goDbaseChangesSince_"$(date +%Y-%m-%d_%H:%M:%S --date -'5 min')
# so the full sql comand would now look like
# mysql --user=UserName --password=UserPassword -vv 2>&1 < path_to_executable_file/list_tables.sql > "path_to_output_file/mgmt2goDbaseChangesFrom_"$(date +%Y-%m-%d_%H:%M:%S --date -'5 min')"_to_"$(date +%H:%M:%S)
# Set the delimeter so you can distingish the delimiter surrounding the Procedure
# (as an intact entity to be passed to the server)
# from the statements inside the Procedure calls
DELIMITER $$
# In case a previous script run created the procedure,
# delete it before running this script again
DROP PROCEDURE IF EXISTS `mgmt2go`.rc_list_tables_procedure$$
# Create a procedure to identify all the tables in the database
# (in this case, I have a database named mgmt2go)
# that contain multiple fields (id, date_modified) against which you want to search
CREATE PROCEDURE `mgmt2go`.rc_list_tables_procedure( IN rc_cutoff_date DATETIME )
BEGIN
# Always DECLARE in sequence: Variables, Cursors, Handler
# Variables
DECLARE rc_last_record BOOLEAN DEFAULT FALSE;
DECLARE rc_table_name varchar(64);
# Cursor
DECLARE rc_table_list CURSOR FOR SELECT DISTINCT `TABLE_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `INFORMATION_SCHEMA`.`COLUMNS`.`TABLE_SCHEMA` = 'mgmt2go'
AND `INFORMATION_SCHEMA`.`COLUMNS`.`COLUMN_NAME`
IN ( 'id' , 'date_modified' )
GROUP BY TABLE_NAME HAVING COUNT( DISTINCT COLUMN_NAME ) = 2
ORDER BY `INFORMATION_SCHEMA`.`COLUMNS`.`TABLE_NAME`;
# Handler
DECLARE CONTINUE HANDLER FOR NOT FOUND SET rc_last_record = TRUE;
# Activate the LOOP
OPEN rc_table_list;
rc_for_each_loop: LOOP
# Test if the previous iteration of the LOOP fetched the last record
# and if so, exit the LOOP
FETCH FROM rc_table_list INTO rc_table_name;
IF rc_last_record = TRUE THEN
LEAVE rc_for_each_loop;
END IF;
# Eliminate the entries in the job_queue table
# since they are just temporary system entries
IF rc_table_name = 'job_queue' THEN
ITERATE rc_for_each_loop;
END IF;
# Find all records in all tables with a date_modified field
# greater than or equal to the specified value in the CALL
# We cannot directly use a variable in a SELECT statement
# So we prepare a SELECT statement by concatenation
# and then use the Prepare and Execute functions to run the SELECT
SET @rc_query_for_modified := CONCAT(
'SELECT "' , rc_table_name , '" , `id` ,`date_modified` '
'FROM `mgmt2go`.`' , rc_table_name , '` '
'WHERE '
'TIMESTAMP( `mgmt2go`.`' , rc_table_name , '`.`date_modified` )'
' >= "' , rc_cutoff_date , '" '
);
PREPARE rc_test_modified_statement FROM @rc_query_for_modified;
EXECUTE rc_test_modified_statement;
DEALLOCATE PREPARE rc_test_modified_statement;
END LOOP rc_for_each_loop;
CLOSE rc_table_list;
END$$
# Reset the delimiter back to the default
DELIMITER ;$$
# Invoke the Procedure, providing the cutoff date = date record more current than
# You can provide an absolute time using
# CALL `mgmt2go`.rc_list_tables_procedure( "2019-01-02 16:49:28" );
# Or you can provide a time n (Seconds/Minutes/...) before a stated time (like NOW()
CALL `mgmt2go`.rc_list_tables_procedure( DATE_SUB( NOW() , INTERVAL 5 MINUTE ) );
# If you are also trying to see if any files have changed in the last n minutes
# and want to NOT search in a particular child directory (/cache in this case)
# at the CLI enter
# find path_to_directory -path path_to_child_directory_to_exclude -prune , -type f -mmin -120
# or
# find path_to_directory -mmin -120 -iname "*.*" | egrep -v "(child_directory_to_exclude)"
# where -120 is the number of minutes to look back (120 in this case)
# -mmin is minutes since modification and -cmin is minutes since creation
# -mtime is days since modification and -ctime is days since creation
언급URL : https://stackoverflow.com/questions/9013494/how-to-select-all-records-that-are-10-minutes-within-current-timestamp-in-mysql
'programing' 카테고리의 다른 글
디렉토리 외부에서 WordPress 사용자 세부 정보 사용 (0) | 2023.10.04 |
---|---|
페이지 로딩 후 jquery code 하는 방법? (0) | 2023.09.24 |
((무부호 char)0x80) << 24가 0xFFFFFF800000(64비트)로 확장되는 이유는 무엇입니까? (0) | 2023.09.24 |
URL에 추가 및 새로 고침 페이지 (0) | 2023.09.24 |
Angular Mat Paginator가 초기화되지 않음 (0) | 2023.09.24 |