我正在努力实现某一天的最后可能时间,例如2008-01-23 00:00:00.000的日期我需要2008-01-23 23:59:59.999或许可以通过使用日期上的dateadd函数领域?
答案是SELECT DATEADD(ms, -3, '2008-01-24')
,解释如下.
来自Marc的博客:
但是等等,Marc ......你说你喜欢使用
BETWEEN
,但是那个查询没有...那是因为BETWEEN
是包容性的,这意味着它包含了终点.如果我订的是下个月第一天午夜到期的订单,那么它将被包括在内.那么如何在期末获得适当的价值呢?这肯定不是通过使用日期部分来组装一个(但是你必须记住它是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))请记住,始终确保你做数学题对输入参数,不列,或者你会杀了特区政府的查询,这意味着可能已被使用没有索引的-Ability.
SELECT DATEADD(ms, -2, DATEADD(dd, 1, DATEDIFF(dd, 0, GetDate())))
我以为你最初有c#..我会把它留在这里以防万一其他人偶然发现这个.
DateTime now = DateTime.Now; DateTime endofDay = now.Date.AddDays(1).AddMilliseconds(-1);
你可以用你试图找出的任何一天替换'now'变量
添加-1 毫秒到开始的的下一个日(DATEADD甚至支持纳秒,如果你想获得真正的罚款).
但很可能你只想在比较中使用这个值,在这种情况下它甚至更简单.
而不是像这样的东西:
AND @CompareDate <= [LastTimeforThatday]
或这个:
@compareDate BETWEEN [StartDate] AND [LastTimeforThatday]
像这样做:
AND @CompareDate < [BeginningOfNextDay]
或这个:
AND (@CompareDate >= [StartDate] AND @CompareDate < [BeginningOfNextDay])