某一段时间,在小于五秒钟内出现2次以上

本文介绍如何使用SQL查询在指定时间段内,同一连锁店同一会员卡号在相同终端连续录入两次以上且时间间隔不超过2分钟的数据。
查询
某一段时间,a在小于五秒钟内出现2次以上


with t as (
select t.a,t.b
from c_table t
where 1 = 1
and b>= to_date('2012-5-29 00:00:00', 'yyyy-MM-dd hh24:mi:ss')
and b<= to_date('2012-5-30 00:00:00', 'yyyy-MM-dd hh24:mi:ss') and t.a>'0' order by t.a
)

select t.* from t where exists(
select 1 from t a where t.a=a.a and
abs(t.b-a.b)<=5/(24*60*60) and abs(t.b-a.b)>0
)


--表信息

连锁店编号 会员卡号 录入员工号 录入终端 录入时间
2012001001 12345678 2012000001 00000001 20120510 16:29:23
2012001001 12345678 2012000001 00000001 20120510 16:30:44
2012001001 12345678 2012000001 00000001 20120510 16:39:12
2012001004 12345678 2012000002 00000001 20120510 16:41:21
2012001004 32345678 2012000002 00000002 20120510 16:43:56
2012001004 22345678 2012000002 00000001 20120510 16:46:49
2012001004 52345678 2012000002 00000002 20120510 16:47:23
2012001001 32345678 2012000003 00000001 20120510 16:49:10
2012001002 82345678 2012000003 00000002 20120510 16:53:08
2012001004 92345678 2012000003 00000003 20120510 16:57:00
2012001005 92345678 2012000003 00000002 20120510 17:01:51
2012001003 82345678 2012000003 00000003 20120510 17:02:23
查询
同一连锁店当日同一会员卡号,在相同的终端连续2次以上(含2次)录入时间=<2分钟


with t as (
select
'2012001001' a,'12345678' b,'2012000001' c,'1' d,to_date('20120510162923','yyyymmddhh24miss') e from dual union all select
'2012001001','12345678','2012000001','1',to_date('20120510163044','yyyymmddhh24miss') from dual union all select
'2012001001','12345678','2012000001','1',to_date('20120510163912','yyyymmddhh24miss')from dual union all select
'2012001004','12345678','2012000002','1',to_date('20120510164121','yyyymmddhh24miss')from dual union all select
'2012001004','32345678','2012000002','2',to_date('20120510164356','yyyymmddhh24miss')from dual union all select
'2012001004','22345678','2012000002','1',to_date('20120510164649','yyyymmddhh24miss')from dual union all select
'2012001004','52345678','2012000002','2',to_date('20120510164723','yyyymmddhh24miss')from dual union all select
'2012001001','32345678','2012000003','1',to_date('20120510164910','yyyymmddhh24miss')from dual union all select
'2012001002','82345678','2012000003','2',to_date('20120510165308','yyyymmddhh24miss')from dual union all select
'2012001004','92345678','2012000003','3',to_date('20120510165700','yyyymmddhh24miss')from dual union all select
'2012001005','92345678','2012000003','2',to_date('20120510170151','yyyymmddhh24miss')from dual union all select
'2012001003','82345678','2012000003','3',to_date('20120510170223','yyyymmddhh24miss') from dual

)

select t.* from t where exists(
select 1 from t a where t.a=a.a and t.b=a.b and t.d= a.d
and abs(t.e-a.e)<=2/(24*60) and abs(t.e-a.e)>0
)

---------------------------------
2012001001 12345678 2012000001 1 2012-5-10 16:29:23
2012001001 12345678 2012000001 1 2012-5-10 16:30:44


/*
oracle 时间相减为天数:

SELECT( to_date('20120510162923','yyyymmddhh24miss') - to_date('20120510163044','yyyymmddhh24miss'))*24 *60 *60 FROM dual
结果为天数:-0.0009375 天
化为分钟:-0.0009375 * 24 *60 = -1.35 分钟
化为秒:-1.35 分钟= -1.35 * 60 = -81秒

*/
<think> 由于要求使用BAT脚本(即Windows批处理脚本)来分割视频,每段视频3-4秒钟,我们可以使用ffmpeg工具来完成这个任务。因为BAT脚本本身并没有处理视频的能力,我们需要借助ffmpeg这个强大的多媒体处理工具。 步骤: 1. 首先,确保已经安装了ffmpeg,并且将其添加到系统环境变量中,以便在命令行中直接使用。 2. 我们将编写一个BAT脚本,该脚本会遍历当前目录下的视频文件(或者指定的视频文件),然后将其分割成多个3-4秒的小片段。 注意:ffmpeg分割视频有多种方式,这里我们使用两种常见的方式: a. 通过设置分段的时间长度,使用-segment_time参数和segment分段器。 b. 或者使用-ss和-to参数来指定每个片段的开始和结束时间。 但是,由于要求每段3-4秒,我们可以每段固定4秒,或者使用随机3-4秒(但通常这种分割是固定时长或根据关键帧分割)。这里为了简单,我们采用每4秒分割一。 然而,ffmpeg的segment分段器可能会在关键帧处分割,所以实际分割点可能不是精确的4秒。为了更精确的分割,我们可以使用以下命令: ffmpeg -i input.mp4 -c copy -f segment -segment_time 4 -reset_timestamps 1 output_%03d.mp4 但是,这种方法要求视频的关键帧间隔小于4秒,否则可能无法精确分割。另一种更精确的方法是使用-ss和-to,但是需要循环。 由于BAT脚本处理循环和浮点数计算比较麻烦,我们可以选择固定分段,但为了满足3-4秒,我们可以随机生成3到4秒之间的时间?但是题目要求每段3-4秒,并没有说一定要随机,我们可以每段3.5秒(取中间值)?但题目没有明确,所以我们按固定4秒分割。 如果要求3-4秒之间的随机片段,那么我们需要计算总时长,然后随机分段,这样会比较复杂。这里我们按照固定4秒分割。 因此,我们采用以下步骤: 1. 获取视频的总时长(以秒为单位) 2. 从0秒开始,每4秒分割一,直到结束。 3. 使用ffmpeg的-ss和-to参数来切割。 但是,在BAT中处理浮点数(因为视频时长可能是小数)和循环比较麻烦。我们可以使用ffprobe获取视频时长,然后进行循环切割。 然而,由于BAT脚本在数学计算上的局限性(不支持浮点运算),我们可以将时间转换成整数秒(向上取整),然后循环切割。 但是,这里为了简单,我们使用ffmpeg的segment方式。但请注意,这种方式可能不是精确的4秒,因为如果关键帧不在4秒处,可能会在下一个关键帧分割。 另一种方法是使用-vf参数,强制在每4秒处插入关键帧,但这会重新编码,速度慢。我们假设视频的关键帧间隔比较小(比如1秒一个关键帧),那么使用segment方式分割,误差在1秒内。 因此,我们使用segment方式,每4秒分割一。如果要求精确,可以重新编码,但这样会损失质量并且速度慢。 考虑到题目要求3-4秒,我们可以接受每段4秒左右。 脚本内容: 我们将当前目录下的所有mp4文件分割成多个4秒的小片段,输出文件名为原文件名加上序号。 但是,由于BAT处理文件名和循环比较复杂,我们只处理一个文件,或者用户拖放文件到脚本上。 为了通用性,我们让用户将视频文件拖放到脚本上,然后对该文件进行分割。 以下是脚本代码(split_video.bat): </think> 下面是一个使用FFmpeg的BAT脚本,用于将视频分割成3-4秒的片段。该脚本会遍历当前目录下的MP4文件,并生成多个分段视频文件: ```bat @echo off setlocal enabledelayedexpansion REM 检查FFmpeg是否安装 where ffmpeg >nul 2>&1 if %errorlevel% neq 0 ( echo FFmpeg未安装或未添加到系统路径 echo 请从 https://ffmpeg.org 下载并安装 pause exit /b ) REM 设置分段时长范围(3-4秒) set min_duration=3 set max_duration=4 for %%F in (*.mp4) do ( echo 正在处理文件: "%%F" REM 获取视频时长(秒) for /f "tokens=2 delims=." %%T in ('ffprobe -v error -show_entries format^=duration -of default^=noprint_wrappers^=1:nokey^=1 "%%F"') do ( set total_duration=%%T ) set /a segment_count=0 set start_time=0 :split_loop set /a segment_duration=!min_duration! + !random! %% (!max_duration! - !min_duration! + 1) set /a end_time=!start_time! + !segment_duration! REM 检查是否超出视频长度 if !end_time! gtr !total_duration! ( set /a end_time=!total_duration! set segment_duration=!end_time!-!start_time! ) REM 生成输出文件名 set output_file="%%~nF_part!segment_count!.mp4" REM 分割视频的命令 ffmpeg -v error -i "%%F" -ss !start_time! -to !end_time! -c copy !output_file! echo 已创建分段: !output_file! (!segment_duration!秒) REM 更新起始时间和计数器 set /a start_time=!start_time! + !segment_duration! set /a segment_count+=1 REM 检查是否继续分割 if !start_time! lss !total_duration! goto :split_loop ) echo 全部分段完成! pause ``` ### 代码解释: 1. **环境检查**: - 使用`where ffmpeg`检查FFmpeg是否可用 - 未安装时显示错误信息并退出 2. **参数设置**: - `min_duration=3`:最小分段时长(秒) - `max_duration=4`:最大分段时长(秒) 3. **视频处理流程**: - 遍历当前目录所有MP4文件 - 使用`ffprobe`获取视频总时长 - 循环生成随机时长的分段(3-4秒) - 使用`-ss`指定开始时间,`-to`指定结束时间 - `-c copy`表示直接复制流数据(不重新编码) 4. **关键命令**: ```bat ffmpeg -i "input.mp4" -ss 开始时间 -to 结束时间 -c copy "输出文件" ``` ### 使用说明: 1. 将脚本保存为`split_video.bat` 2. 确保安装了[FFmpeg](https://ffmpeg.org)并添加到系统PATH 3. 将视频文件放在同一目录 4. 双击运行脚本 5. 分段视频将生成在原目录,命名格式:`原文件名_part序号.mp4` > **注意**:此脚本使用流复制(`-c copy`),速度极快但可能在某些关键帧处有微小误差。如需精确切割,可移除`-c copy`进行重新编码(速度会变慢)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值