Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как правильно сравнивать даты?  [new]
novexelf
Member

Откуда: this
Сообщений: 184
Создал тестовую табличку:
+

CREATE TABLE [dbo].[test]
(
	[Id] [int] IDENTITY(1,1) NOT NULL primary key,
	[d] [date] NULL,
	[dt] [datetime] NULL,
	[dt2] [datetime2](7) NULL,
	[sdt] [smalldatetime] NULL
)



Наполнил ее тестовыми данными:
+


Id d dt dt2 sdt
1 2012-01-01 2012-01-01 00:00:00.000 2012-01-01 00:00:00.0000000 2012-01-01 00:00:00
2 2012-01-02 2012-01-02 00:00:00.000 2012-01-02 00:00:00.0000000 2012-01-02 00:00:00
3 2012-01-03 2012-01-03 00:00:00.000 2012-01-03 00:00:00.0000000 2012-01-03 00:00:00
4 2012-01-04 2012-01-04 00:00:00.000 2012-01-04 00:00:00.0000000 2012-01-04 00:00:00
5 2012-01-05 2012-01-05 00:00:00.000 2012-01-05 00:00:00.0000000 2012-01-05 00:00:00
6 2012-01-06 2012-01-06 00:00:00.000 2012-01-06 00:00:00.0000000 2012-01-06 00:00:00
7 2012-01-07 2012-01-07 00:00:00.000 2012-01-07 00:00:00.0000000 2012-01-07 00:00:00
8 2012-01-08 2012-01-08 00:00:00.000 2012-01-08 00:00:00.0000000 2012-01-08 00:00:00
9 2012-01-09 2012-01-09 00:00:00.000 2012-01-09 00:00:00.0000000 2012-01-09 00:00:00
10 2012-01-01 2012-01-01 01:00:00.000 2012-01-01 03:00:00.0000000 2012-01-01 21:00:00
11 2012-01-02 2012-01-02 01:00:00.000 2012-01-02 03:00:00.0000000 2012-01-02 21:00:00
12 2012-01-03 2012-01-03 01:00:00.000 2012-01-03 03:00:00.0000000 2012-01-03 21:00:00
13 2012-01-04 2012-01-04 01:00:00.000 2012-01-04 04:00:00.0000000 2012-01-04 21:00:00
14 2012-01-05 2012-01-05 01:00:00.000 2012-01-05 05:00:00.0000000 2012-01-05 21:00:00
15 2012-01-06 2012-01-06 01:00:00.000 2012-01-06 06:00:00.0000000 2012-01-06 21:00:00
16 2012-01-07 2012-01-07 01:00:00.000 2012-01-07 07:00:00.0000000 2012-01-07 21:00:00
17 2012-01-08 2012-01-08 01:00:00.000 2012-01-08 08:00:00.0000000 2012-01-08 21:00:00
18 2012-01-09 2012-01-09 01:00:00.000 2012-01-09 09:00:00.0000000 2012-01-09 21:00:00
19 2012-01-01 2012-01-01 15:00:00.000 2012-01-01 22:00:00.0000000 2012-01-01 23:00:00
20 2012-01-02 2012-01-02 15:00:00.000 2012-01-02 22:00:00.0000000 2012-01-02 23:00:00
21 2012-01-03 2012-01-03 15:00:00.000 2012-01-03 22:00:00.0000000 2012-01-03 23:00:00
22 2012-01-04 2012-01-04 15:00:00.000 2012-01-04 22:00:00.0000000 2012-01-04 23:00:00
23 2012-01-05 2012-01-05 15:00:00.000 2012-01-05 22:00:00.0000000 2012-01-05 23:00:00
24 2012-01-06 2012-01-06 15:00:00.000 2012-01-06 22:00:00.0000000 2012-01-06 23:00:00
25 2012-01-07 2012-01-07 15:00:00.000 2012-01-07 22:00:00.0000000 2012-01-07 23:00:00
26 2012-01-08 2012-01-08 15:00:00.000 2012-01-08 22:00:00.0000000 2012-01-08 23:00:00
27 2012-01-09 2012-01-09 15:00:00.000 2012-01-09 22:00:00.0000000 2012-01-09 00:00:00


Запрос по полю с типом [date]:
+

SELECT [Id],[d],[dt],[dt2],[sdt]
FROM [ATOL].[dbo].[test]
Where d >= '03.01.2012' And d <= '03.01.2012'



выдает, как и предполагалось, 3 записи:
+


Id d dt dt2 sdt
3 2012-01-03 2012-01-03 00:00:00.000 2012-01-03 00:00:00.0000000 2012-01-03 00:00:00
12 2012-01-03 2012-01-03 01:00:00.000 2012-01-03 03:00:00.0000000 2012-01-03 21:00:00
21 2012-01-03 2012-01-03 15:00:00.000 2012-01-03 22:00:00.0000000 2012-01-03 23:00:00


Запрос по полю с типом [datetime]:
+

SELECT [Id],[d],[dt],[dt2],[sdt]
FROM [ATOL].[dbo].[test]
Where dt >= '03.01.2012 00:00:00' And dt <= '03.01.2012 23:59:59'



выдает, как и предполагалось, 3 записи:
+


Id d dt dt2 sdt
3 2012-01-03 2012-01-03 00:00:00.000 2012-01-03 00:00:00.0000000 2012-01-03 00:00:00
12 2012-01-03 2012-01-03 01:00:00.000 2012-01-03 03:00:00.0000000 2012-01-03 21:00:00
21 2012-01-03 2012-01-03 15:00:00.000 2012-01-03 22:00:00.0000000 2012-01-03 23:00:00


Запрос по полю с типом [datetime2]:
+

SELECT [Id],[d],[dt],[dt2],[sdt]
FROM [ATOL].[dbo].[test]
Where dt2 >= '01.01.2012 00:00:00' And dt2 <= '01.01.2012 23:59:59'



выдает, как и предполагалось, 3 записи:
+


Id d dt dt2 sdt
1 2012-01-01 2012-01-01 00:00:00.000 2012-01-01 00:00:00.0000000 2012-01-01 00:00:00
10 2012-01-01 2012-01-01 01:00:00.000 2012-01-01 03:00:00.0000000 2012-01-01 21:00:00
19 2012-01-01 2012-01-01 15:00:00.000 2012-01-01 22:00:00.0000000 2012-01-01 23:00:00


Запрос по полю с типом [smalldatetime]:
+

SELECT [Id],[d],[dt],[dt2],[sdt]
FROM [ATOL].[dbo].[test]
Where sdt >= '03.01.2012 00:00:00' And sdt <= '03.01.2012 23:59:59'



выдает 4 записи:
+


Id d dt dt2 sdt
3 2012-01-03 2012-01-03 00:00:00.000 2012-01-03 00:00:00.0000000 2012-01-03 00:00:00
4 2012-01-04 2012-01-04 00:00:00.000 2012-01-04 00:00:00.0000000 2012-01-04 00:00:00
12 2012-01-03 2012-01-03 01:00:00.000 2012-01-03 03:00:00.0000000 2012-01-03 21:00:00
21 2012-01-03 2012-01-03 15:00:00.000 2012-01-03 22:00:00.0000000 2012-01-03 23:00:00


Почему?
И как правильно выбрать данные за период по полям с типами smalldatetime, datetime2, datetime, date?

+

Select @@Version



Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86) Mar 29 2009 10:27:29 Copyright (c) 1988-2008 Microsoft Corporation Express Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
17 фев 12, 12:36    [12108824]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сравнивать даты?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
novexelf,

http://msdn.microsoft.com/ru-ru/library/ms182418.aspx
Точность Одна минута
17 фев 12, 12:40    [12108856]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сравнивать даты?  [new]
iljy
Member

Откуда:
Сообщений: 8711
novexelf,

потому что
select cast('03.01.2012 23:59:59' as smalldatetime)

Правильно - посмотреть в документации допустимые значение типов. Ну и - лучше заменить проверку на <, надежнее будет, потому что для datetime и datetime2 ваши запросы тоже неправильные.
17 фев 12, 12:40    [12108858]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сравнивать даты?  [new]
Glory
Member

Откуда:
Сообщений: 104751
novexelf
Запрос по полю с типом [smalldatetime]:

А вы внимательно читали в хелпе про тип данных smalldatetime ?
К какому значению smalldatetime будет преобразовано '03.01.2012 23:59:59' ?
17 фев 12, 12:41    [12108866]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно сравнивать даты?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
novexelf,

для представления даты в строковом формате, всё-таки, пользуйтесь форматом без раделителей или ISO-8601.
Если это для Вас слишком просто, то хотя бы преобразуйте функцией CONVERT с соответствующим третьим параметром.

Использование данных даты и времени

SELECT [Id],[d],[dt],[dt2],[sdt]
FROM [ATOL].[dbo].[test]
Where sdt >= '20120103' And sdt < '20120104'
17 фев 12, 12:49    [12108960]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить