Время отбрасывания в DateTime - PullRequest
17 голосов
/ 29 января 2009

У меня проблема с тем, что моя таблица хранит дату как

2009-01-10 10:00:00.000

и у меня есть другая таблица, в которой дата хранится как

2009-01-10 12:00:00.000

Я знаю, что они не совпадают, но даты есть, есть ли в SQL возможность легко сократить время и сохранить только даты для сравнения? Спасибо.

Ответы [ 16 ]

0 голосов
/ 30 января 2009

StingyJack это правильно, но в зависимости от того, что вы хотите сделать, вы можете лучше хранить дату как целое число, если вам никогда не понадобится часть времени.

create table #datedemo(
 id         integer primary key identity(1,1) not null
,date       datetime not null
,dateint    int 
)

insert into #datedemo (date)
          select '2009-Jan-29 02:12:00'
union all select '2009-Jan-29 16:22:00'
union all select '2009-Jan-30 00:32:00'
union all select '2009-Jan-30 13:42:00'
union all select '2009-Jan-31 01:52:00'
union all select '2009-Feb-01 12:02:00'

update #datedemo set dateint = floor(cast(date as float))

select id,date,dateint,cast(dateint as datetime) from #datedemo
where dateint = floor(cast(cast('2009-Jan-30' as datetime)as float))

drop table #datedemo
0 голосов
/ 30 января 2009

Использование SQLMenaces, на мой взгляд, самый быстрый способ сократить время ожидания даты. Тем не менее, он также заставляет некоторые запросы работать как свинья, исключая возможность использования индексов ...

[A] JOIN [B] ON SQLMenace([A].datetime) = SQLMenace([B].datetime)

(Where SQLMenace() is the operation he described *grin*)

Чтобы разрешить использование ИНДЕКСОВ на 2-й таблице, нужно просто немного изменить ...

[A] JOIN [B] ON [A].datetime >= SQLMenace([B].datetime) AND [A].datetime < SQLMenace([B].datetime)

Это должно вызвать сканирование на [B] и поиск индекса на [A] ...

0 голосов
/ 30 января 2009

Я знаю, что они не совпадают, но даты есть, есть ли в SQL возможность легко отбросить время и сохранить только даты для сравнения? Спасибо

хорошо, если тип данных поля smalldatetime вместо datetime , вы сможете использовать и обновлять только даты, время всегда будет 00:00: 000 независимо от того, что вы вставляете.


Чтобы избежать проблем с датами, я лично всегда использую

CONVERT( smalldatetime, @myDate, 103 ) 

103 ( вы можете увидеть в справке ) это дд / мм / гггг и отлично работает со мной, я использую эту технику, потому что я использую британский / французский формат даты и серверы в США, где они все это меняют: -D

это была единственная идея, которая пришла мне в голову в то время (6 лет назад), и я застрял с ней.

Но вы можете подумать, вместо того, чтобы добавлять поле DateTime , добавить int и указать количество секунд с 01-01-1970, у вас никогда не будет даты проблемы, и каждый раз, когда вам нужно получить дату, просто вычтите текущую дату из этих секунд.

Этот метод очень часто используется в больших программах в разных странах, чтобы избежать проблем, например, всемирно известное приложение CRM под названием SuperOffice

0 голосов
/ 30 января 2009

Мой любимый способ отображать (и сравнивать) только дату - использовать:

convert(char(10),getdate(),101)

где getdate () может быть вашим значением даты и времени.

Я считаю, что он конвертируется в формат MM / DD / YYYY

0 голосов
/ 30 января 2009

Есть много хороших предложений по уменьшению времени ожидания , но , если вы просто ищете способ сравнить дни без учета компонента времени, просто сделайте это:

Select * From SomeTable Where (DateDiff(d, FirstDate, SecondDate) = 0)

То есть используйте DateDiff с аргументом "d" для сравнения, а не "=".

На всякий случай это то, чем вы являетесь действительно после ...

0 голосов
/ 30 января 2009

Я предлагаю выбрать стандарт и изменить одну из таблиц, чтобы она соответствовала другой. В противном случае код вашего приложения должен будет помнить, какая таблица использует какой метод навсегда. Определитесь со стандартом и придерживайтесь его. Если в одной таблице действительно полночь, а в другой - полдень, то временная часть даты все равно не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...