我的SQL查询有一个小问题。我正在使用GETDATE函数,但是,假设我在下午5点执行脚本,它将在12/12/2011 5PM到12/18/2011 5PM之间提取记录。我怎样才能使整个12/12/2011的记录都拉起来-12/18/2011基本忽略时间。
我的剧本:
WHERE Orders.OrderStatus = 'Shipped'
AND Orders.ShipDate > (GETDATE()-6)
Answers:
在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)
这是我发现的最简单的东西
-- Midnight floor of current date
SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()))
DATEDIFF返回1900-1-1之前或之后的整数天数,并且Convert Datetime强制将其返回到午夜的该日期。
由于DateDiff返回一个整数,因此您可以使用加减天数来获取正确的偏移量。
SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()) + @dayOffset)
这不是在四舍五入,而是在被截断……但是我认为这就是要问的问题。(要四舍五入,然后截断...这也不是四舍五入,即上限,但也很可能是您想要的。要真正四舍五入,添加.5(行得通吗?)并截断。
事实证明,您可以将.5添加到GetDate(),它可以按预期工作。
-- Round Current time to midnight today or midnight tomorrow
SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE() + .5))
我在SQL Server 2008上进行了所有试用,但是我认为这些功能也适用于2005。
where [ScanDate] >= convert(datetime, datediff(day, 0, getdate())) and [ScanDate] < convert(datetime, datediff(day, -1, getdate()))
--
-- 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
SELECT getdate()
结果:2012-12-14 16:03:33.360
SELECT convert(datetime,convert(bigint, getdate()))
结果2012-12-15 00:00:00.000
如@BassamMehanni所述,您可以在SQL Server 2008及更高版本中强制转换为DATE。
SELECT
*
FROM
yourTable
WHERE
dateField >= CAST(GetDate() - 6 AS DATE)
AND dateField < CAST(GetDate() + 1 AS DATE)
第二个条件实际上可以是just 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)
我通常会
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)
希望这可以帮助