我不确定为什么您的 select 语句中没有出现此错误,因为我可以仅使用
SET DATEFORMAT DMY;
SELECT CONVERT(DATETIME, CONVERT(VARCHAR,CAST(GETUTCDATE() AS DATE)))
错误示例
您依赖于本地化转换设置,您应该使用显式转换,例如
SET DATEFORMAT DMY;
SELECT CONVERT(DATETIME, CONVERT(VARCHAR, CAST(GETUTCDATE() AS DATE), 111), 111)
通过显式定义日期格式以转换为 varchar 和 varchar (111),您可以避免任何隐含的转换。
但是,如果您的日期/时间是这样存储的,则不需要所有与 varchar 之间的转换,这只是更多出错的机会和不必要的工作,您可以简单地将时间添加到日期时间。例如
DECLARE @Date1 DATETIME = DATEADD(HOUR, 1, GETUTCDATE()),
@Date2 DATETIME = DATEADD(DAY, 1, GETUTCDATE());
SELECT [Date1] = @Date1,
[Date2] = @Date2,
[Date1/Time2] = CAST(CAST(@Date1 AS DATE) AS DATETIME) +
CAST(@Date2 AS TIME);
从我可以从您的查询中收集到的信息,您只是想获得时间meas_pain.datetime
小于当前 UTC 时间的结果,无论日期如何。因此,您应该能够将查询简化为:
SELECT schedules.id
FROM meas_pain
LEFT JOIN schedules
ON schedules.id = meas_pain.schd_id
WHERE meas_pain.schd_id = 9150
AND CAST(meas_pain.[DateTime] AS TIME) < CAST(GETUTCDATE() AS TIME);
并删除进一步的冗余转换。
SQL Fiddle 上的简化示例
附录
显然这个时间比较不是你所追求的(尽管它是你发布的查询正在做的),所以我假设 GETUTCDATE() 只是为了演示。
您尝试执行的转换等同于:
CAST(CAST(GETUTCDATE() AS DATE) AS DATETIME) + CAST(meas_pain.[DateTime] AS TIME)
另一个使用上述转换的 SQL Fiddle 示例