AOI上传漏数据 SQL server

select * from xx (nolock) where testtime>’2026-08-08 08:10:10.321′ and testtime<‘2026-08-08 10:10:10.999’ 在 2026-08-08 10:10:10.999 查询处理 50 行数据,但是同样的 sql 在 2026-08-08 10:12:10.999 查询有 51 行。 什么情况?

SQL Server 时间范围查询,过 2 分钟多出来 1 条数据

SQL:

sql

select * from xx with(nolock) 
where testtime>'2026-08-08 08:10:10.321' 
  and testtime<'2026-08-08 10:10:10.999'
  • 10:10:10.999 执行:返回 50 行
  • 10:12:10.999(2 分钟后)执行:返回 51 行

核心现象:查询条件完全没变,只是现实时间往后走了 2 分钟,结果行数 + 1。数据库 SQL Server。

根因 1:datetime 精度坑(最高概率)

datetime 类型精度是 3.33 毫秒,不是 1 毫秒。

它只能取:.000、.003、.007、.010 ……

999 毫秒给 datetime,内部会自动舍入到 10:10:11.000

plaintext

'2026-08-08 10:10:10.999'  → datetime 存储会变成 → 2026-08-08 10:10:11.000

你的条件:testtime < '2026-08-08 10:10:10.999'

等价于:testtime < 2026-08-08 10:10:11.000

那为什么同一套 SQL,不同现实时间查,行数不一样?

👉 那条多出的记录:testtime = '2026-08-08 10:10:10.997'(真实数据库存储时间)

  1. 10:10:10.999 现实时刻执行查询时:这条记录还没有插入表,所以返回 50
  2. 现实时间走到 10:12:10.999,这条数据已经被业务插入完成,条件满足,多 1 行,返回 51

SQL 文本条件写死,SQL 语句本身没有变,是表里面多插入了一条符合条件的新数据。

你误以为查询快照是 “查询瞬间的数据库”,但确实就是:10:10 点查询的时候该行还没产生,2 分钟后数据落库了,再跑同样 where,自然多一行。


根因 2:WITH (NOLOCK) 脏读(次高概率)

nolock = 读未提交隔离级别,会读到未提交事务的数据。

场景还原:

  1. 10:10:10.999 你第一次执行 SQL: 另外会话开始 insert xx testtime='2026-08-08 10:10:10.997',事务还没 commit。
    • nolock:未提交的数据,有可能看不见(取决于页锁状态)→ 返回 50 行。
  2. 10:12:10.999 第二次执行 SQL: 那个 insert 事务已经 commit,数据正式可见 → 返回 51 行。

⚠️ nolock 不保证每次返回完全一致快照,脏读、幻读是它的固有特性,不能拿来做报表统计、数据对账。

重点区分:不是 SQL 变了,是数据库状态发生变化:新增数据 / 事务提交。

根因 3:幻读(普通隔离级别也会)

默认 READ COMMITTED,也会发生幻读:两次相同查询,中间别的会话 insert 符合 where 条件的行,第二次查询行数增加。这是标准 SQL 幻读现象。


验证方法,快速定位

1、确认 testtime 字段数据类型

sql

sp_help 'xx'
  • 如果是 datetime → 毫秒舍入坑实锤。
  • 如果是 datetime2(3) → 没有 3.33ms 舍入问题。

2、把那条多出的行捞出来

直接把上限开大,看那一条的真实 testtime:

sql

select testtime,* 
from xx with(nolock)
where testtime>'2026-08-08 08:10:10.321' 
and testtime < '2026-08-08 10:10:11.000'
order by testtime desc

看最大的那一条的testtime真实值。

3、确认这条记录的生成时间

看是否就是在 10:10 ~10:12 之间插入的。

修复写法(时间范围标准最佳实践)

❌ 错误写法(datetime 极易踩坑)

sql

testtime < '2026-08-08 10:10:10.999'

✅ 推荐写法(左闭右开,通用,datetime/datetime2 全部兼容)

sql

WHERE testtime > '2026-08-08 08:10:10.321'
  AND testtime < '2026-08-08 10:10:11.000'

想要截止到 10:10:10 这一秒全部数据,上限直接写下一秒零点,不要写 999 毫秒。

关于 nolock 的风险提醒

做统计对账、导出业务数据,强烈不建议使用with(nolock)

  1. 脏读:读到回滚的垃圾数据
  2. 幻读:相同 SQL,不同时刻行数不一致(你现在遇到的)
  3. 有可能读重复行、漏行(分配页拆分,allocation scan)

如果要快照一致性,建议:

  • 开启数据库 READ_COMMITTED_SNAPSHOT ON,去掉 nolock,使用行版本快照读取。

复盘你的现象总结

你的 SQL 语句where 条件字符串完全没变,但是两次执行,底层表的数据发生变化:

第一次查询时,那条 51 行的数据还不存在(未插入 / 未提交);

过两分钟数据 insert+commit 完成,再次执行相同 where 条件,自然多返回一行。

nolock放大了这个现象,datetime毫秒舍入容易干扰你判断边界。



总之:sql server优化和使用门槛有点高。日志文件大,事务提交,电脑资源吃完等。

https://www.bilibili.com/opus/1186900004562796560?spm_id_from=333.1387.0.0

优化:

导出TXT(csv)数据有时候,还是靠谱。 www.erwa.cn 二娃备忘

实时数据导出 lastdata.txt 实时覆盖,只保留一条数据或者一个产品或者一次测试的数据。
历史数据导出 每个产品,每次测试导出一个文件。

导出到access,sqlite容易占用等。放弃


上一篇 ASP.NET Core 生产级开源文档系统
下一篇 串口测试指南
signoz和日志系统 elk的区别?

signoz和日志系统 elk的区别?

SigNoz vs ELK(Elastic Stack),结合你 C# 上位机 + PLC 采集 的场景 一句话概括: ELK:以日志全文检索为核心的日志栈(ES 倒排索引,擅长全文搜报错文本),指标、链路追踪是附加能力,多组件拼凑 SigNoz:OTel 原生一体化可观测平台,

2026-10-20
0 0 0
DateTime.UtcNow , DateTime.Now 有什么区别

DateTime.UtcNow , DateTime.Now 有什么区别

DateTime.UtcNow vs DateTime.Now(C#) 一句话总结 DateTime.UtcNow:获取世界协调时间(UTC,零时区),不受电脑系统时区影响。 DateTime.Now:获取本地时间 = UTC 时间 + 当前操作系统时区偏移。 详

2026-10-16
0 0 0
winform 开机启动

winform 开机启动

c# winform 写的采集程序。平时是登录 windows 桌面,手动点开运行 winform 程序。但是要改成开机启动,不要登录 windows 桌面也能执行 winform 程序。有没有什么办法?不要改造 winform 程序 先说核心结论 WinForm

2026-10-16
0 0 0
C# + Scriban:生成 HTML 报表,自动发邮件(MES / 生产报表场景)

C# + Scriban:生成 HTML 报表,自动发邮件(MES / 生产报表场景)

补充:这套方案在工厂圈子使用情况 MailKit 自动发邮件:大量 MES 在用 Playwright 自动截图 HTML 报表:不少工厂自动化报表在用,属于成熟方案,但不是每个项目都会上。很多项目嫌麻烦就直接 PDF 或者纯表格邮件。 Scriban + Playwright

2026-10-14
0 0 0
C# + Scriban 做静态站点生成

C# + Scriban 做静态站点生成

C# + Scriban 做静态站点生成(对标 baifenwei 的 generate_site.py) Scriban 是 .NET 生态下高性能模板引擎,语法类似 Liquid / Jinja2,刚好用来替代 Python Jinja2,写一个 C# 控制台程序(GenerateSite

2026-10-14
0 0 0
REA(rea.tools)“万物可逆向”:噱头很大,但不是真的什么都能逆向

REA(rea.tools)“万物可逆向”:噱头很大,但不是真的什么都能逆向

REA(rea.tools)“万物可逆向”:噱头很大,但不是真的什么都能逆向 全称 REA = Reverse Engineer Anything,“逆向一切” 只是项目口号,不是能力承诺。 https://rea.tools https://github.com/morluto

2026-10-14
0 0 0
采集上位机LOG文件,不停追加,文件大小50MB

采集上位机LOG文件,不停追加,文件大小50MB

txt 文件很大,40MB,50MB,txt 持续追加,这种场景。Logstash File Input、Flume Taildir、阿里云 Logtail、NewLifeX/X 日志查看工具 Klogg Log Parser Lizard https://githu

2026-10-10
0 0 0
AOI 图片上传 【分布式】方案

AOI 图片上传 【分布式】方案

车间 aoi 的相机图片上传,用飞牛 nas,群晖 nas,高并发,按 5TB / 天、60 天、500 台设备,能不能抗住?如果我在一台服务器放多个 ftp 服务,每条线一个 ftp 服务,端口 8001,第二条线 ftp 服务,端口 8002。ftp 靠谱还 nas 靠谱?稳定,生成环境

2026-10-09
0 0 0
MES 系统 的几种ID比较,雪花id,ULID,UUID

MES 系统 的几种ID比较,雪花id,ULID,UUID

实际场景:浏览器指纹和cookie的UUID 项目FingerprintJS visitorId bdc65ad12633d79792ceeca33a78e6c551.la 访客 ID 5a00c3da-ab80-513d-b7a7-894bcaaecf92来源读取浏览器硬件 / 软件特征,前

2026-10-09
0 0 0
ACCESS数据库访问报错

ACCESS数据库访问报错

AI最擅长找错,分析原因。 💥💥问题1:exclusively locked 因为ACCESS打开数据库后,表:TO_LOGGER_INFO ,当设计视图窗体时,另一个c#小程序去访问这个access数据库会报错: ERROR [HY000] [Microsoft][ODBC Mi

2026-09-29
0 0 0