有没有更有效的方法来结束一天的工作?

Ang*_*ker 0 sql sql-server sql-server-2017

我有一个 DATETIME 变量@DateEnd = '1/4/2011 16:43:22 PM'。我想得到一天的结束:1/4/2011 23:59:59.997

我有以下内容并且工作正常,但它有很多转换并且似乎效率不高:

DECLARE @DateString VARCHAR(25)
DECLARE @DateEnd DATETIME = '1/4/2011 16:43:22 PM'

SET @DateString = CONVERT(VARCHAR(10), @DateEnd, 101) + ' 23:59:59.997'
SET @DateEnd = CAST(DateString AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

有没有更有效的方法来实现这一目标?

Joe*_*orn 5

通常,我们所做的是获取第二天开始时的 0/午夜值,然后<对范围的末端使用独占不等式边界 ( ),而不是包含等式边界 ( <=)。

DECLARE @DateEnd DATETIME = '20110104 16:43:22'
SET @DateEnd = DATEADD(day, 1, Cast(@DateEnd as Date))
Run Code Online (Sandbox Code Playgroud)

像问题中那样为 SQL 格式化日期时间文字也是不行的。不同的文化和语言对于日期的外观有自己的规范和期望,将自己的个人或文化规范强加到这些语言中是不好的。SQL 作为它自己的语言,也不例外。如果您正在编写 SQL 并且没有使用 SQL 的日期值格式(yyyyMMddyyyy-MM-ddTHH:mm:ss[.fff]yyyyMMdd HH:mm:ss[.fff]),则该上下文的格式错误

例如,我自己的首选格式是 ,yyyy-MM-dd HH:mm:ss它与那些可接受的格式不太匹配,在先学习了一些其他(过程)语言之后才开始使用 SQL。我承认多年来我经常使用这种格式;您可能可以在我在 Stack Overflow 上的回答中找到示例。但我这样做的每个地方都是错误的,我不再使用它。所以不要太难受;每个人都必须学习这一点。