为什么会有人使用它?

 桥之西海_744 发布于 2023-02-10 15:29

我在我试图解决的SQL报告中遇到了这行代码.有人能告诉我这是什么目的.

DATEADD(dd, - DATEDIFF(dd, d.TxnDateTime, 1), 1) As TxnDate

对我来说,它似乎会取消自己.

2 个回答
  • 它可能是为SQL Server 2005编写的,当时CONVERT(DATE只是微软员工的一个亮点,当我们不得不使用繁琐,低效和难以解释的变通方法来删除时间部分时DATETIME.

    当然,人们仍然使用那些繁琐,有效且难以解释的方法.但我不认为这里的任何人可以告诉你原因,特别是如果你正在寻找特定开发人员在特定情况下选择特定格式的原因.我们根本无法代替他们.也许他们从其他地方偷了它,也许它实际上对他们有意义,也许他们只是插上它而不知道它做了什么.

    今天,更好的方法是:

    CONVERT(DATE, d.TxnDateTime);
    

    ......我已多次证明这一点,包括这里和这里.

    现在,如果您尝试获取d.TxnDateTime特定日期的所有行,则更好的方法是使用DATE参数和开放式范围查询:

    WHERE d.TxnDateTime >= @ThatDay
      AND d.TxnDateTime <  DATEADD(DAY, 1, @ThatDay);
    

    这优于:

    WHERE CONVERT(DATE, d.TxnDateTime) = @ThatDay;
    

    因为,虽然sargable,这种表达仍然会导致相当差的基数估计.有关更多信息,请参阅此非常详尽的帖子

    https://dba.stackexchange.com/questions/34047/cast-to-date-is-sargable-but-is-it-a-good-idea

    阅读本文也许不是一个坏主意:

    https://sqlblog.org/2009/10/16/bad-habits-to-kick-mis-handling-date-range-queries

    这也是关于dd:

    https://sqlblog.org/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations

    2023-02-10 15:33 回答
  • 它正在删除TIME部分DATETIME而不更改数据类型.你可以在这里观察不同的行为: SQL小提琴

    同样,不确定为什么DATETIME在删除时间时需要保留类型,除非它早于DATE数据类型.

    2023-02-10 15:35 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有