it-swarm-pt.tech

Arredondando o SQL DateTime para a meia-noite

Estou tendo um pequeno problema com minha consulta SQL. Estou usando a função GETDATE, no entanto, digamos que eu execute o script às 5 da tarde, ele vai puxar registros entre 12/12/2011 5pm para 18/12/2011 17:00. Como posso fazê-lo puxar registros para todo o 12/12/2011 - 18/12/2011 basicamente ignorar o tempo.

Meu script:

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate > (GETDATE()-6)  
68
henryaaron

No SQL Server 2008 e mais recente, você pode converter o DateTime em um Date, o que remove o elemento time.

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

No SQL Server 2005 e abaixo, você pode usar:

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

Aqui está a coisa mais simples que encontrei

-- Midnight floor of current date

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

O DATEDIFF retorna o número inteiro de dias antes ou depois de 1900-1-1, e o Convert Data Datetime o traz de volta a essa data à meia-noite.

Como o DateDiff retorna um inteiro, você pode adicionar ou subtrair dias para obter o deslocamento correto.

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

Isso não está arredondando isso está truncando ... Mas eu acho que é o que está sendo perguntado. (Para arredondar adicionar um e truncar ... e isso não é arredondamento também, que o teto, mas mais uma vez provavelmente o que você quer. Para realmente arredondar adicionar 0,5 (isso funciona?) E truncar.

Acontece que você pode adicionar 0,5 para GetDate () e funciona como esperado.

-- Round Current time to midnight today or midnight tomorrow

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

Fiz todas as minhas tentativas no SQL Server 2008, mas acho que essas funções se aplicam também a 2005.

45
Darrel Lee
--
-- 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
edvox1138
SELECT getdate()

Resultado: 2012-12-14 16: 03: 33.360

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

Resultado 2012-12-15 00: 00: 00.000

4
Jeremy Atkinson

Tente usar isso.

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

Como mencionado por @BassamMehanni, você pode converter como DATE no SQL Server 2008 em diante ...

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

A segunda condição pode, na verdade, ser apenas GetDate(), mas estou mostrando esse formato como um exemplo de Less Than DateX para evitar ter que converter o dateField em DATE, melhorando assim o desempenho.


Se você está em 2005 ou abaixo, você pode usar isso ...

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

Isso pode parecer barato, mas está funcionando para mim

SELECT CONVERT (DATETIME, LEFT (CONVERT (VARCHAR, @ dateFieldOrVariable, 101), 10) + '00: 00: 00.000')

1
Jean-Louis Gervais

Eu costumo fazer

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

se você estiver usando o SQL SERVER 2008, você pode fazer

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

Espero que isto ajude

0
Bassam Mehanni