将 SQL 日期时间四舍五入到午夜

问题描述 投票:0回答:11

我的 SQL 查询遇到一个小问题。我正在使用 GETDATE 函数,但是,假设我在下午 5 点执行脚本,它将提取 2011 年 12 月 12 日下午 5 点到 2011 年 12 月 18 日下午 5 点之间的记录。我怎样才能让它拉出整个12/12/2011 - 12/18/2011的记录基本上忽略时间。

我的脚本:

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate > (GETDATE()-6)  
sql sql-server sql-server-2005 getdate
11个回答
133
投票

在 SQL Server 2008 及更高版本中,您可以将

DateTime
转换为
Date
,这会删除时间元素。

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= (cast(GETDATE()-6 as date))  

在 SQL Server 2005 及更低版本中,您可以使用:

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= DateAdd(Day, Datediff(Day,0, GetDate() -6), 0)

65
投票

这是我发现的最简单的事情

-- Midnight floor of current date

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()))

DATEDIFF 返回 1900 年 1 月 1 日之前或之后的整数天数, 并且“转换日期时间”会很乐意将其恢复到午夜的日期。

由于 DateDiff 返回一个整数,您可以使用添加或减去天数来获得正确的偏移量。

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()) + @dayOffset)

这不是四舍五入,这是截断......但我认为这就是所要求的。 (要四舍五入加一并截断...这也不是四舍五入,即上限,但是 再次很可能是你想要的。要真正舍入,请添加 0.5(这有效吗?)并截断。

事实证明,您可以将 .5 添加到 GetDate() 并且它会按预期工作。

-- Round Current time to midnight today or midnight tomorrow

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE() + .5))

我在 SQL Server 2008 上进行了所有试验,但我认为这些功能也适用于 2005。


14
投票
--
-- SQL DATEDIFF getting midnight time parts 
--
SELECT GETDATE() AS Now, 
   Convert(DateTime, DATEDIFF(DAY, 0, GETDATE())) AS MidnightToday,
   Convert(DateTime, DATEDIFF(DAY, -1, GETDATE())) AS MidnightNextDay,
   Convert(DateTime, DATEDIFF(DAY, 1, GETDATE())) AS MidnightYesterDay
go
Now                   MidnightToday          MidnightNextDay        MidnightYesterDay     
 --------------------  ---------------------  ---------------------  --------------------- 
 8/27/2014 4:30:22 PM  8/27/2014 12:00:00 AM  8/28/2014 12:00:00 AM  8/26/2014 12:00:00 AM 

7
投票

您可以将日期时间转换为日期,然后再转换回日期时间。这将重置时间戳。

选择 getdate() --2020-05-05 13:53:35.863

选择演员(演员(GETDATE()作为日期)作为日期时间)--2020-05-05 00:00:00.000

5
投票
SELECT getdate()

结果:2012-12-14 16:03:33.360

SELECT convert(datetime,convert(bigint, getdate()))

结果2012-12-15 00:00:00.000


3
投票

正如 @BassamMehanni 提到的,您可以在 SQL Server 2008 及以后的版本中将其转换为 DATE...

SELECT
  *
FROM
  yourTable
WHERE
      dateField >= CAST(GetDate() - 6 AS DATE)
  AND dateField <  CAST(GetDate() + 1 AS DATE)

第二个条件实际上可以只是

GetDate()
,但我将这种格式作为
Less Than DateX
的示例进行展示,以避免将 dateField 也转换为 DATE,从而极大地提高性能。


如果你是2005年或以下,你可以使用这个...

SELECT
  *
FROM
  yourTable
WHERE
      dateField >= DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) - 6, 0)
  AND dateField <  DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) + 1, 0)

3
投票

尝试使用这个。

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= CONVERT(DATE, GETDATE())

1
投票

这可能看起来很便宜,但对我有用

选择转换(日期时间,左(转换(VARCHAR,@dateFieldOrVariable,101),10)+'00:00:00.000')


0
投票

我经常这样做

SELECT *
FROM MyTable
WHERE CONVERT(VARCHAR, MyTable.dateField, 101) = CONVERT(VARCHAR, GETDATE(), 101)

如果您使用的是 SQL SERVER 2008,您可以这样做

SELECT *
FROM MyTable
WHERE CAST(MyTable.dateField AS DATE) = CAST(GETDATE() AS DATE)

希望这有帮助


0
投票

您可以将时间四舍五入。

使用下面的

ROUND
会将其四舍五入到午夜。

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >  CONVERT(datetime, (ROUND(convert(float, getdate()-6.5),0)))

-1
投票

嗨尝试使用以下查询

select * from table where column_name <=(cast(GETDATE() as date)) and column_name >=(cast(GETDATE()-1 as date)).

我创建了虚拟数据并测试了上面的查询工作正常。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.