SQL Server 日期比较问题

Posted

技术标签:

【中文标题】SQL Server 日期比较问题【英文标题】:SQL Server Date Comparison issue 【发布时间】:2021-11-03 17:23:34 【问题描述】:

每当两个日期的关系不正确时,我都会尝试在不同的表中标记一个字段。但是,数据集中的所有日期都不应标记任何内容(应为 0 而不是 1),但它们都标记。在查询期间更改日期格式是否有问题?真的卡在这里了

Example output

UPDATE Theatre_DQ_03_Integrity_CASES
SET AnaesToTheatreFlag = 1, TimeErrorFlag = 1
FROM Theatre_Cases_Landing a
INNER JOIN
(
    SELECT  Case_ID
    FROM Theatre_Cases_Landing 
    WHERE (CaseCancelled IS NULL or CaseCancelled = 'N') AND (CONVERT(datetime,Anaesthetic_Start_DateTime) > CONVERT(datetime,In_Theatre_DateTime)) 
    AND Anaesthetic_Start_DateTime IS NOT NULL AND In_Theatre_DateTime IS NOT NULL
) b
ON a.Case_ID = b.Case_ID

declare @var1 as  datetime2 = '2019-09-04 11:12:00.000'
declare @var2 as  datetime2 = '2019-09-04 11:13:00.000' 
if @var1 < @var2 PRINT('TRUE')

【问题讨论】:

我没有看到目标表 (Theatre_DQ_03_Integrity_CASES) 和 FROM/JOIN 条件之间存在关联,因此表中的每一行都会更新。 @DanGuzman 你如何解决这个问题?相同的内部连接方法似乎适用于其他目的?这两个表都与案例 ID 相关,谢谢 您能否在Theatre_Cases_Landing 中显示您认为有问题的一行?也许您的日期时间比较不适合您的要求。我假设您不认为 Anaesthetic_Start_DateTime 应该在 In_Theatre_DateTime 之前(对于未取消的案例)并希望 update 这些案例。如果您可以显示任何未正确处理的案例(带有日期时间),那将有所帮助。 在查询期间更改日期格式是否有问题? - 您将日期时间存储在 varchars 中? 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。 【参考方案1】:

您需要将要更新的行与其他表中的行关联起来。否则,目标中的每一行都会被更新。

我认为不需要自行加入 Theatre_Cases_Landing。以下是相关性未经测试的版本。

UPDATE target
SET AnaesToTheatreFlag = 1, TimeErrorFlag = 1
FROM Theatre_DQ_03_Integrity_CASES AS target
JOIN Theatre_Cases_Landing AS a ON a.Case_ID = target.Case_ID
WHERE
    (a.CaseCancelled IS NULL or a.CaseCancelled = 'N')
    AND CONVERT(datetime,a.Anaesthetic_Start_DateTime) > CONVERT(datetime,a.In_Theatre_DateTime) 
    AND a.Anaesthetic_Start_DateTime IS NOT NULL
    AND a.In_Theatre_DateTime IS NOT NULL;

【讨论】:

成功了,非常感谢。这只是我使用 SQL 的第二周,所以还在学习!非常有帮助:)

以上是关于SQL Server 日期比较问题的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2005 日期比较 - 排序问题

将日期字符串与 SQL Server 中的日期时间进行比较?

SQL Server:仅比较月份和日期 - SARGable

如何在 sql server 2008 中将日期与 GETDATE() 进行比较

sqlserver 中 怎么用比较日期进行查询?

比较 SQL Server 中 3 列之间的日期值并在 SQL Server 中提取资产信息