我正在尝试实现特定日期的最后可能时间,例如日期为 2008-01-23 00:00:00.000 我可能需要 2008-01-23 23:59:59.999 可能通过在日期上使用 dateadd 函数场地?
5 回答
答案是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能力,这意味着可能已使用的索引不是。
SELECT DATEADD(ms, -2, DATEADD(dd, 1, DATEDIFF(dd, 0, GetDate())))
起初我以为你有 c#。我会把这个留在这里,以防其他人偶然发现这个。
DateTime now = DateTime.Now;
DateTime endofDay = now.Date.AddDays(1).AddMilliseconds(-1);
您可以将“现在”变量替换为您想要找出的任何一天
将 -1毫秒添加到第二天的开始(DateAdd 甚至支持纳秒,如果你想得到真正的罚款)。
但很可能你只是想在比较中使用这个值,在这种情况下它会更简单。
而不是这样的:
AND @CompareDate <= [LastTimeforThatday]
或这个:
@compareDate BETWEEN [StartDate] AND [LastTimeforThatday]
像这样做:
AND @CompareDate < [BeginningOfNextDay]
或这个:
AND (@CompareDate >= [StartDate] AND @CompareDate < [BeginningOfNextDay])
为什么要重蹈覆辙?
SELECT DATEADD(ms, 86399997, *yourDate*)
我能够使用:
select {fn curdate()} + ' 23:59:59.000'
或者
select DATEADD(ss,-1,DATEADD(DAY,1,CAST({fn curdate()} as DATETIME)))
结束一天