2010-07-20 10 views
37
select * 
from table 
where date > '2010-07-20 03:21:52' 

które spodziewam się nie dał mi żadnych wyników ... oprócz Dostaję rekord z datetime z 2010-07-20 03:21:52.577SQL Server usuń milisekund od datetime

Jak mogę dokonać kwerendy ignorować milisekund?

+0

Jeśli umieścisz (SQL) kod lub XML, ** proszę ** podświetl te linie w edytorze tekstu i kliknij przycisk "kod" (101 010) na pasku narzędzi edytora, aby ładnie sformatować i podświetlić składnię! –

Odpowiedz

60

po prostu wymyślić milisekundową część daty i odjąć ją przed porównaniem, w ten sposób:

select * 
from table 
where DATEADD(ms, -DATEPART(ms, date), date) > '2010-07-20 03:21:52' 
16
select * from table 
    where DATEADD(ms, DATEDIFF(ms, '20000101', date), '20000101') > '2010-07-20 03:21:52' 

Będziesz musiał przyciąć milisekund przed porównania, która będzie wolna od wielu rzędach

Wykonaj jedną z nich, aby rozwiązać ten problem:

  • stworzył kolumny obliczane z powyższych wyrażeń Aby porównać z
  • usunąć milisekundy na włożeniu/aktualizacji, aby uniknąć obciążenia narzutowego
  • Jeśli SQL Server 2008, użyj datetime2(0)
+1

datetime2 jest najlepszym (najtańszym) rozwiązaniem IMO – vacip

+1

@vacip: w 2010 roku byłoby mniej SQL Server 2008+ i więcej SQL Server 2005, który nie miał datetime2 – gbn

13

Spróbuj:

SELECT * 
FROM table 
WHERE datetime > 
CONVERT(DATETIME, 
CONVERT(VARCHAR(20), 
CONVERT(DATETIME, '2010-07-20 03:21:52'), 120)) 

Albo jeśli data jest aktualna wartość datetime:

DECLARE @date DATETIME 
SET @date = GETDATE() 
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(20), @date, 120)) 

Konwersja do stylu 120 odcina milisekund ...

+0

Wciąż pokazuje 3 ostatnie cyfry –

+0

'CONVERT (DATETIME , CONVERT (VARCHAR (20), @date, 120)) 'jest doskonałym rozwiązaniem do porównywania wartości DateTime przy ignorowaniu milisekund. Dzięki. – Kon

8

W tym konkretnym zapytaniem, dlaczego dokonać drogiego wywołania funkcji dla każdego wiersza, kiedy można po prostu poprosić o wartości wyjściowych na następny wyższy sekund:

select * 
from table 
where date >= '2010-07-20 03:21:53' 
1

Jest więcej niż jeden sposób, aby to zrobić:

select 1 where datediff(second, '2010-07-20 03:21:52', '2010-07-20 03:21:52.577') >= 0 

lub

select * 
from table 
where datediff(second, '2010-07-20 03:21:52', date) >= 0 

jeden mniej wywołanie funkcji, a Y musisz uważać na przepełnienie maksymalnej liczby całkowitej, jeśli daty są zbyt odległe.

0

Jeszcze jeden sposób skonfigurować zapytania SQL Server, aby zignorować milisekundy, gdy szukam zdarzeń z określonej sekundy (w parametrze "Format YYYY-MM-DD HH: TT: SS") przy użyciu procedura składowana:

WHERE 
    ...[Time_stamp] >= CAST(CONCAT(@YYYYMMDDHHTTSS,'.000') as DateTime) AND 
    ...[Time_stamp] <= CAST(CONCAT(@YYYYMMDDHHTTSS,'.999') as DateTime) 

Można użyć czegoś podobnego do ignorowania minut i sekund.

1

Spróbuj tego

select substring('12:20:19.8470000',1,(CHARINDEX('.','12:20:19.8470000',1)-1)) 


(No column name) 
12:20:19 
0

Może to pomoże .. SELECT [Datetime] = CAST ('20120228' AS smalldatetime)

O/P: 2012-02-28 00:00:00

4

Jeśli używasz SQL Server (począwszy od 2008), wybierz jeden sposób:

  • konwertowania (datetime2 (0) YourDateField)
  • LEWO (RTRIM (konwersja (datetimeoffset, YourDateField)), 19)
  • konwertowania (datetimeoffset (0) YourDateField) - - z dodatkiem ti mnie strefa przesunięcie
0

Zastosowanie CAST z następującymi parametrami:

Data

select Cast('2017-10-11 14:38:50.440' as date) 

wyjściowa: 2017-10-11

Datetime

select Cast('2017-10-11 14:38:50.440' as datetime) 

wyjściowa: 11.10.2017 14: 38: 50,440

smalldatetime

select Cast('2017-10-11 14:38:50.440' as smalldatetime) 

wyjściowa: 2017-10-11 14:39:00

datetimeoffset

select Cast('2017-10-11 14:38:50.440' as datetimeoffset) 

wyjściowa: 11.10.2017 14: 38: +50,4400000 +00: 00

datetime2

select Cast('2017-10-11 14:38:50.440' as datetime2) 

wyjściowa: 11.10.2017 14: 38: 50,4400000

-1

Wykorzystanie „smalldatetime "typ danych

select convert (smalldatetime, getdate())

pobierze 2015-01-08 15:27:00

Powiązane problemy