SQL时间戳格式转换及当前日期筛选问题求助
看起来你在SQL Server里处理日期格式和当日订单筛选时遇到了两个关键问题,我来一步步帮你梳理解决:
1. 日期格式转换的正确方式
你提到用Select convert(varchar,DDCTMS,101) as Entered from OCRI没得到想要的YYYY-MM-DD格式,这是因为样式101对应的是MM/DD/YYYY格式(比如05/09/2020),并非你需要的YYYY-MM-DD。
如果要准确转换为YYYY-MM-DD格式,推荐两种更规范的写法:
- 使用样式23(专门对应
YYYY-MM-DD格式):SELECT CONVERT(varchar(10), DDCTMS, 23) AS Entered FROM OCRI - 或者直接将字段转为
date类型(SQL Server 2008及以上版本支持),系统会自动输出YYYY-MM-DD格式:SELECT CAST(DDCTMS AS date) AS Entered FROM OCRI
你之前用Select CONVERT(varchar(10), DDCTMS) as Entered from Ocri成功转换,本质是SQL Server默认将datetime类型转字符串时,前10位恰好是YYYY-MM-DD,但这种写法依赖默认行为,不如指定样式更可靠。
2. 筛选当日订单的正确方法
你遇到的'curdate' is not a recognized built-in function name错误,是因为curdate()是MySQL的内置函数,SQL Server中没有这个函数,对应的替代方案有两种:
方法一:利用日期范围筛选(性能更优,可复用索引)
如果DDCTMS是datetime类型,直接比较日期范围比转换字段更高效,还能利用字段上的索引:
SELECT CONVERT(varchar(10), DDCTMS, 23) AS Entered FROM OCRI WHERE DDCTMS >= CAST(GETDATE() AS date) AND DDCTMS < DATEADD(day, 1, CAST(GETDATE() AS date))
这个写法会筛选出从今日00:00:00到次日00:00:00之间的所有记录,完美匹配当日订单。
方法二:转换字段为date类型后比较
如果追求代码简洁,也可以将DDCTMS转为date类型,再和当前日期对比:
SELECT CONVERT(varchar(10), DDCTMS, 23) AS Entered FROM OCRI WHERE CAST(DDCTMS AS date) = CAST(GETDATE() AS date)
注意:这种写法如果DDCTMS上有索引,可能无法被数据库利用,数据量大时性能会受影响,因此优先推荐方法一。
另外,SQL Server里获取当前日期的函数还有CURRENT_TIMESTAMP(和GETDATE()功能一致)、DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE()))(手动构造当日日期),你可以根据习惯选择使用。
内容的提问来源于stack exchange,提问作者Carlos

