22

我正在尝试实现特定日期的最后可能时间,例如日期为 2008-01-23 00:00:00.000 我可能需要 2008-01-23 23:59:59.999 可能通过在日期上使用 dateadd 函数场地?

4

5 回答 5

27

答案是SELECT DATEADD(ms, -3, '2008-01-24'),解释如下。

来自马克的博客

但是等等,马克……你说你喜欢使用BETWEEN,但那个查询没有……那是因为它BETWEEN 是 inclusive,这意味着它包括端点。如果我有一份在下个月第一天午夜到期的订单,它将被包括在内。那么如何获得期末的适当值呢?肯定不是通过使用日期部分来组装一个(但你必须这样做,请记住它是 23:59:59.997 作为最长时间......不要忘记毫秒)。为了做到这一点,我们使用 Microsoft SQL ServerDATETIME最多具有的乱伦知识3毫秒的分辨率(不会改变的东西)。所以我们所做的就是从上面给出的任何期末公式中减去 3 毫秒。例如,昨天(当地时间)的最后一个可能瞬间是:

    SELECT DATEADD(ms, -3, DATEADD(dd, DATEDIFF(dd, 0, GetDate()), 0))

因此,要将本月到期的订单作为BETWEEN查询,您可以使用以下命令:

    SELECT [ID]
    FROM [dbo].[Orders]
    WHERE [ShipDue] BETWEEN DATEADD(mm, DATEDIFF(mm, 0, GetUTCDate()), 0)
    AND DATEADD(ms, -3, DATEADD(mm, DATEDIFF(mm, 0, GetUTCDate()) + 1, 0))

请记住,始终确保您对输入参数而不是列进行数学运算,否则您将杀死查询的SARG能力,这意味着可能已使用的索引不是。

于 2008-10-03T15:12:50.873 回答
15
SELECT DATEADD(ms, -2, DATEADD(dd, 1, DATEDIFF(dd, 0, GetDate())))

起初我以为你有 c#。我会把这个留在这里,以防其他人偶然发现这个。

DateTime now = DateTime.Now;
DateTime endofDay = now.Date.AddDays(1).AddMilliseconds(-1);

您可以将“现在”变量替换为您想要找出的任何一天

于 2008-10-03T15:10:41.953 回答
8

将 -1毫秒添加到第二天开始(DateAdd 甚至支持纳秒,如果你想得到真正的罚款)。

但很可能你只是想在比较中使用这个值,在这种情况下它会更简单。

而不是这样的:

AND @CompareDate <= [LastTimeforThatday]

或这个:

@compareDate BETWEEN [StartDate] AND [LastTimeforThatday]

像这样做:

AND @CompareDate < [BeginningOfNextDay]

或这个:

AND (@CompareDate >= [StartDate] AND @CompareDate < [BeginningOfNextDay])
于 2008-10-03T15:28:43.040 回答
3

为什么要重蹈覆辙?

SELECT DATEADD(ms, 86399997, *yourDate*)
于 2015-07-20T19:39:13.993 回答
0

我能够使用:

select {fn curdate()} + ' 23:59:59.000'

或者

select DATEADD(ss,-1,DATEADD(DAY,1,CAST({fn curdate()} as DATETIME)))

结束一天

于 2022-02-17T21:22:26.870 回答