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

Откуда: Moscow city
Сообщений: 616
у меня сравнение масивов по дате
в частоте случаев они совпадают и только 1% случаев в одном из массивов встречаются даты содержащие время.
можно ли как нибудь ключем отключить время и чтобы сравнение было без холостых и бессмысленных конвертов в 99% процентах случаев. так как конверт потянет запрос вниз по стоимости исполнения.

в диктанте три-четыре варнинга, но в общем компилируется
22 фев 12, 09:45    [12134857]     Ответить | Цитировать Сообщить модератору
 Re: сравнение даты и датывремя  [new]
iljy
Member

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

1. В скуле нет массивов.
2. В скуле нет кнопки "сделать по-моему".
3. https://www.sql.ru/forum/actualthread.aspx?tid=127456
22 фев 12, 09:48    [12134877]     Ответить | Цитировать Сообщить модератору
 Re: сравнение даты и датывремя  [new]
SHKoder
Member

Откуда: Moscow city
Сообщений: 616
declare @d1 datetime = '2011.09.23 14:16:12',
        @d2 datetime = '2011.09.23'

if  @d1 = @d2 print 'equal' else print 'not equal'


@@version
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)
Jun 17 2011 00:54:03
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: )
22 фев 12, 09:53    [12134899]     Ответить | Цитировать Сообщить модератору
 Re: сравнение даты и датывремя  [new]
iljy
Member

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

declare @d1 datetime = '20110923 14:16:12',
        @d2 datetime = '20110923'

if  datediff(d, @d1,@d2) = 0 print 'equal' else print 'not equal'
if  cast(@d1 as DATE) = CAST(@d2 as DATE) print 'equal' else print 'not equal'


про накладные расходы, учитывая формат хранения даты, тут говорить даже как-то смешно.
22 фев 12, 09:59    [12134947]     Ответить | Цитировать Сообщить модератору
 Re: сравнение даты и датывремя  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5115
SHKoder,
а зачем datetime ежели вам всё одно только даты нужны?
22 фев 12, 10:06    [12134974]     Ответить | Цитировать Сообщить модератору
 Re: сравнение даты и датывремя  [new]
SHKoder
Member

Откуда: Moscow city
Сообщений: 616
все эти методы известны, а так же convert(<type>, variable, <format>)
но это все замедляет рабут процесса даже в случае
declare @d1 datetime = '2011.09.23 00:00:00',
        @d2 datetime = '2011.09.23'

if  @d1 = @d2 print 'equal' else print 'not equal'

я хочу избавить от операторов конвертирования и дополнительных преобразований.

ищу ключ, который позволил отключить чувствительно ко времени в типах дат datetime, datetime2 и прочих datetime2(n), datetimeoffset(n)

что то вроде
set dateformat dmy
но это мне не помогает, говорит что я тип переполнил.

а хранить приходится дататайм не по моей воле, так заложено рахитектурнов БД.
это тут пример на переменных, а в жизни у меня две таблицы с полями типа данных datetime.
22 фев 12, 10:15    [12135044]     Ответить | Цитировать Сообщить модератору
 Re: сравнение даты и датывремя  [new]
Glory
Member

Откуда:
Сообщений: 104751
SHKoder
я хочу избавить от операторов конвертирования и дополнительных преобразований.

ищу ключ, который позволил отключить чувствительно ко времени в типах дат datetime, datetime2 и прочих datetime2(n), datetimeoffset(n)

Нет ключей, которые автоматически конвертируют один тип данных в другой
22 фев 12, 10:16    [12135053]     Ответить | Цитировать Сообщить модератору
 Re: сравнение даты и датывремя  [new]
SHKoder
Member

Откуда: Moscow city
Сообщений: 616
описался, извините:

все эти методы известны, а так же convert(<type>, variable, <format>)
но это все замедляет работу процесса даже в случае
declare @d1 datetime = '2011.09.23 00:00:00',
@d2 datetime = '2011.09.23'

if convert(datetime, @d1, 120) = convert(datetime, @d2, 120) print 'equal' else print 'not equal'

вот
22 фев 12, 10:17    [12135055]     Ответить | Цитировать Сообщить модератору
 Re: сравнение даты и датывремя  [new]
SHKoder
Member

Откуда: Moscow city
Сообщений: 616
Glory
Нет ключей, которые автоматически конвертируют один тип данных в другой


понятно, спасибо.

просто хотело что-нибудь из области
set TimeSensivity Off
жаль , конечно, что это я придумал.
22 фев 12, 10:18    [12135068]     Ответить | Цитировать Сообщить модератору
 Re: сравнение даты и датывремя  [new]
iljy
Member

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

а вы сами придумали про потери производительности или подсказал кто? Проверить-то 2 минуты!

+ Данные
use tempdb
if object_id('t1') is not null drop table t1
if object_id('t2') is not null drop table t2
if object_id('t3') is not null drop table t3
if object_id('t4') is not null drop table t4
go
declare @cnt int = 1000000
create table t1 (id int identity primary key, d datetime)
create table t2 (id int identity primary key, d datetime)

insert t1(d)
select top(@cnt) DATEADD(mi, ROW_NUMBER() over (order by (select 1)), 0)
from master..spt_values v1, master..spt_values v2, master..spt_values v3

insert t2(d)
select top(@cnt) DATEADD(mi, ROW_NUMBER() over (order by (select 1)) + v1.number, 0)
from master..spt_values v1, master..spt_values v2, master..spt_values v3
where v1.type = 'P'

create table t3 (id int identity primary key, d date)
create table t4 (id int identity primary key, d date)

insert t3(d)
select top(@cnt) DATEADD(mi, ROW_NUMBER() over (order by (select 1)), 0)
from master..spt_values v1, master..spt_values v2, master..spt_values v3

insert t4(d)
select top(@cnt) DATEADD(mi, ROW_NUMBER() over (order by (select 1)) + v1.number, 0)
from master..spt_values v1, master..spt_values v2, master..spt_values v3
where v1.type = 'P'


+ Тест
declare @d datetime2, @c int, @i int, @mc int =1

select @d = SYSDATETIME(), @c = @mc
while @c > 0
begin
	select @i = COUNT(*), @c -=1
	from t1 join t2 on t1.id = t2.id
	where datediff(d, t1.d, t2.d) = 0
end
print datediff(ms, @d, sysdatetime())

select @d = SYSDATETIME(), @c = @mc
while @c > 0
begin
	select @i = COUNT(*), @c -=1
	from t3 join t4 on t3.id = t4.id
	where t3.d = t4.d
end
print datediff(ms, @d, sysdatetime())

Наслаждайтесь.
22 фев 12, 10:31    [12135141]     Ответить | Цитировать Сообщить модератору
 Re: сравнение даты и датывремя  [new]
SHKoder
Member

Откуда: Moscow city
Сообщений: 616
iljy,
+
CREATE function dbo.get_datetime_diff (@db DateTime,
@de DateTime)
RETURNS varchar(250)
AS
BEGIN

declare @y numeric(10),
@m numeric(10),
@d numeric(10),
@h numeric(10),
@n numeric(10),
@s numeric(10),
@c numeric(10),
@result varchar(250)

set @result = ''

if IsDate(@db) = 0
begin
set @result = convert(varchar(50), @db) + ' - Не ДатаВремя'
RETURN @result
end

if IsDate(@de) = 0
begin
set @result = convert(varchar(50), @de) + ' - Не ДатаВремя'
RETURN @result
end



if @de = @db
set @result = 'Разницы нет'

--************************
set @y=DATEDIFF(year, @db, @de)

set @db=DATEADD(year, @y, @db)
if @db>@de begin
SET @y=@y-1
set @db=DATEADD(year, -1, @db)
end
--************************
set @m=DATEDIFF(month, @db, @de)

set @db=DATEADD(month, @m, @db)
if @db>@de begin
SET @m=@m-1
set @db=DATEADD(month, -1, @db)
end
--************************
set @d=DATEDIFF(day, @db, @de)

set @db=DATEADD(day, @d, @db)
if @db>@de begin
SET @d=@d-1
set @db=DATEADD(day, -1, @db)
end
--************************
set @h=DATEDIFF(hour, @db, @de)

set @db=DATEADD(hour, @h, @db)
if @db>@de begin
SET @h=@h-1
set @db=DATEADD(hour, -1, @db)
end
--************************
set @n=DATEDIFF(mi, @db, @de)

set @db=DATEADD(mi, @n, @db)
if @db>@de begin
SET @n=@n-1
set @db=DATEADD(mi, -1, @db)
end
--************************
set @s=DATEDIFF(ss, @db, @de)

set @db=DATEADD(ss, @s, @db)
if @db>@de begin
SET @s=@s-1
set @db=DATEADD(ss, -1, @db)
end
--************************
set @c=DATEDIFF(ms, @db, @de)

set @db=DATEADD(ms, @c, @db)
if @db>@de begin
SET @c=@c-1
set @db=DATEADD(ms, -1, @db)
end
--************************

set @result = @result + case
when @y = 0 then ''
when @y > 0 or (len(@result) = 0)
then cast(@y as varchar) + case
when right(cast(@y as varchar),1) in(1,2,3,4)
then ' г. '
else ' л. '
end
else ''
end
set @result = @result + case
when @m = 0 then ''
when @m > 0 or (len(@result) = 0)
then cast(@m as varchar) + ' мес. '
else ''
end
set @result = @result + case
when @d = 0 then ''
when (@d > 0) or (len(@result) = 0)
then cast(@d as varchar) + ' дн. '
else ''
end
set @result = @result + case
when @h = 0 then ''
when (@h > 0) or (len(@result) = 0)
then cast(@h as varchar) + ' час. '
else ''
end
set @result = @result + case
when @n = 0 then ''
when (@n > 0) or (len(@result) = 0)
then cast(@n as varchar) + ' мин. '
else ''
end
set @result = @result + case
when @s = 0 then ''
when (@s > 0) or (len(@result) = 0)
then cast(@s as varchar) + ' сек. '
else ''
end
set @result = @result + case
when @c = 0 then ''
when (@c > 0) or (len(@result) = 0)
then cast(@c as varchar) + ' мс. '
else ''
end

if @result = '' or @result is null
set @result = 'нет данных'

RETURN @result
END

declare @i numeric(10) = 1
declare @ds datetime = getdate()

declare @d1 datetime = '2011.09.23 14:16:12',
        @d2 datetime = '2011.09.23'

while @i <= 10000000
begin
    if convert(datetime, convert(varchar(10), @d1, 120),120) = convert(datetime, convert(varchar(10), @d2, 120),120)
    set @i = @i + 1
end

select dbo.get_datetime_diff(@ds, getdate())
22 фев 12, 10:45    [12135236]     Ответить | Цитировать Сообщить модератору
 Re: сравнение даты и датывремя  [new]
SHKoder
Member

Откуда: Moscow city
Сообщений: 616
хотя может и правда разница не столь велика. тема закрыта. спасибо участникам.
22 фев 12, 10:47    [12135247]     Ответить | Цитировать Сообщить модератору
 Re: сравнение даты и датывремя  [new]
iljy
Member

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

ахренеть... А чего через CONVERT в строку-то, чего веб-сервисы не задействовать, или хоть ActiveX?
22 фев 12, 10:54    [12135286]     Ответить | Цитировать Сообщить модератору
 Re: сравнение даты и датывремя  [new]
жуть-то какая
Guest
SHKoder
...


да еще и неправильная

select dbo.get_datetime_diff('2012-01-31', '2012-02-28') 
select dbo.get_datetime_diff('2012-02-01', '2012-02-28') 
22 фев 12, 10:57    [12135305]     Ответить | Цитировать Сообщить модератору
 Re: сравнение даты и датывремя  [new]
жуть-то какая
Guest
а вот это просто прелестно...

@db DateTime, 
@de DateTime

...

if IsDate(@db) = 0 
begin
set @result = convert(varchar(50), @db) + ' - Не ДатаВремя'
RETURN @result
end

if IsDate(@de) = 0 
begin
set @result = convert(varchar(50), @de) + ' - Не ДатаВремя'
RETURN @result
end
22 фев 12, 11:01    [12135337]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить