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

Откуда:
Сообщений: 6
Всем привет!
Подскажите, почему данный IIF не отрабатывает корректно?
Ну или он работает корректно, но логику я тогда не понимаю.

Структура базы [url= ЗДЕСЬ]http://gokemon.site90.net/tutorials/wp-content/uploads/2013/02/Northwind.png[/url]

SELECT 
IIF 
(
DATENAME(dy, BirthDate) <= DATENAME(dy, getdate()), 
DATEDIFF(yy, BirthDate, getdate()), 
DATEDIFF(yy, BirthDate, getdate())-1
)
AS Age
FROM Employees

Получаем такой результат:
Age
67
63
53
79
60
53
56
57
50


А должно быть так:
Age
67
63
52
78
60
52
55
58
50
28 янв 16, 23:04    [18743076]     Ответить | Цитировать Сообщить модератору
 Re: Оператор IIF неверно отрабатывает условие.  [new]
Glory
Member

Откуда:
Сообщений: 104751
ForspaMail
А должно быть так:
Age
67
63
52
78
60
52
55
58
50

И почему же должно быть именно так ?
28 янв 16, 23:07    [18743094]     Ответить | Цитировать Сообщить модератору
 Re: Оператор IIF неверно отрабатывает условие.  [new]
Ну или он
Guest
ForspaMail,

для начала может все-таки datepart, а не datename
чтобы числа сравнивать как числа
28 янв 16, 23:19    [18743141]     Ответить | Цитировать Сообщить модератору
 Re: Оператор IIF неверно отрабатывает условие.  [new]
iap
Member

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

для начала может все-таки datepart, а не datename
чтобы числа сравнивать как числа
Даты лучше сравнивать как даты
29 янв 16, 10:01    [18744092]     Ответить | Цитировать Сообщить модератору
 Re: Оператор IIF неверно отрабатывает условие.  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
т.е. заменить
DATENAME(dy, BirthDate) <= DATENAME(dy, getdate()),
на
BirthDate <= getdate(), 


но проблема тут вероятно не с этим... стоит обратить внимание что выдает разница в один день:
select DATEDIFF(yy, '20151231', '20160101')



iap
iap
пропущено...
Даты лучше сравнивать как даты
29 янв 16, 10:18    [18744179]     Ответить | Цитировать Сообщить модератору
 Re: Оператор IIF неверно отрабатывает условие.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Bator
но проблема тут вероятно не с этим... стоит обратить внимание что выдает разница в один день:
Даже ещё проще.
Надо набрать в поиске на этом форуме слово "возраст".
И не изобретать велосипед.
29 янв 16, 10:21    [18744194]     Ответить | Цитировать Сообщить модератору
 Re: Оператор IIF неверно отрабатывает условие.  [new]
ForspaMail
Member

Откуда:
Сообщений: 6
iap
Bator
но проблема тут вероятно не с этим... стоит обратить внимание что выдает разница в один день:
Даже ещё проще.
Надо набрать в поиске на этом форуме слово "возраст".
И не изобретать велосипед.


Спасибо большое за ответы и советы.
Но ситуация требует прояснения "для себя".
Вот пример запроса:
SELECT 
	DATENAME(dy,BirthDate) AS [1],
	DATENAME(dy,getdate()) AS [2],
	TF
FROM 
(
	SELECT 
		BirthDate,
		IIF (
			DATENAME(dy,BirthDate) <= DATENAME(dy,getdate()), 
			'TRUTH', 
			'False'
			)
		AS [TF]
		FROM Employees AS Emp
)
Emp


А вот результат выполнения запроса:

#12TF
134332False
25032False
324232TRUTH
426232TRUTH
56332False
618332TRUTH
715032TRUTH
8932False
92732TRUTH


Видим следующую картину:
Строки 1,2,5,9 отработали верно, а остальные - нет.
Вот и вопрос - почему?
Объясните, пожалуйста.
1 фев 16, 14:07    [18756419]     Ответить | Цитировать Сообщить модератору
 Re: Оператор IIF неверно отрабатывает условие.  [new]
Glory
Member

Откуда:
Сообщений: 104751
ForspaMail
Вот и вопрос - почему?

Отработали неправильно и отработали не так, как вы думаете - это разные вещи

ForspaMail
Объясните, пожалуйста.

Вы понимаете, что такое сравнение чисел и что такое сравнение символьных строк, содержащих цифры ?

Сообщение было отредактировано: 1 фев 16, 14:11
1 фев 16, 14:11    [18756455]     Ответить | Цитировать Сообщить модератору
 Re: Оператор IIF неверно отрабатывает условие.  [new]
ForspaMail
Member

Откуда:
Сообщений: 6
Glory
ForspaMail
Вот и вопрос - почему?

Отработали неправильно и отработали не так, как вы думаете - это разные вещи

Я полностью с вами согласен - я ожидал другого результата.

Glory
ForspaMail
Объясните, пожалуйста.

Вы понимаете, что такое сравнение чисел и что такое сравнение символьных строк, содержащих цифры ?

Я новичек и уверен, что не все принял во внимание. По-этому я и задаю вопросы знающим людям.
Спасибо за ответы.
1 фев 16, 14:16    [18756500]     Ответить | Цитировать Сообщить модератору
 Re: Оператор IIF неверно отрабатывает условие.  [new]
Glory
Member

Откуда:
Сообщений: 104751
ForspaMail
Я новичек и уверен, что не все принял во внимание. По-этому я и задаю вопросы знающим людям.

Если вы не знаете разницы между числом и строкой, то вам еще рано запросы писать.
Вам надо на курсы программирования пойти.
1 фев 16, 14:19    [18756535]     Ответить | Цитировать Сообщить модератору
 Re: Оператор IIF неверно отрабатывает условие.  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
ForspaMail
Вот и вопрос - почему?
Объясните, пожалуйста.
Потому что datename возвращает строку, а не число.
declare @t table (d1 date, d2 date);

insert into @t
values
 ('20160104', '20161201');

select
 t.a, t.b, sql_variant_property(t.a, 'BaseType'),
 case when t.a > t.b then 1 else 0 end,
 case when cast(t.a as int) > cast(t.b as int) then 1 else 0 end
from
 @t cross apply
 (select datename(dy, d1), datename(dy, d2)) as t(a, b);
1 фев 16, 14:19    [18756537]     Ответить | Цитировать Сообщить модератору
 Re: Оператор IIF неверно отрабатывает условие.  [new]
ForspaMail
Member

Откуда:
Сообщений: 6
invm
ForspaMail
Вот и вопрос - почему?
Объясните, пожалуйста.
Потому что datename возвращает строку, а не число.
declare @t table (d1 date, d2 date);

insert into @t
values
 ('20160104', '20161201');

select
 t.a, t.b, sql_variant_property(t.a, 'BaseType'),
 case when t.a > t.b then 1 else 0 end,
 case when cast(t.a as int) > cast(t.b as int) then 1 else 0 end
from
 @t cross apply
 (select datename(dy, d1), datename(dy, d2)) as t(a, b);


Вот СПАСИБИЩЕ громадное!
Это как раз то, что мне нужно!
Спасибо за пинок в правильном направлении :)
Теперь запрос отрабатывает так, как я от него ожидал:
SELECT 
	cast(DATENAME(dy,BirthDate) as int) AS [1],
	cast(DATENAME(dy,getdate()) as int) AS [2],
	TF
FROM 
(
	SELECT 
		BirthDate,
		IIF (
			cast(DATENAME(dy,BirthDate) as int) <= cast(DATENAME(dy,getdate()) as int), 
			'TRUTH', 
			'False'
			)
		AS [TF]
		FROM Employees AS Emp
)
Emp


А вот и результат:
# 1 2 TF
1 343 32 False
2 50 32 False
3 242 32 False
4 262 32 False
5 63 32 False
6 183 32 False
7 150 32 False
8 9 32 TRUTH
9 27 32 TRUTH
1 фев 16, 14:35    [18756721]     Ответить | Цитировать Сообщить модератору
 Re: Оператор IIF неверно отрабатывает условие.  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
ForspaMail,

Вы мазохист или у вас принцип использовать всегда и везде только одну функцию для всех случаешь жизни?:))
вам наверное постов 10 назад сказали, чтобы вы заменили DATENAME на DATEPART, но вы явно раньше служили где нить в вдв, раз вместо замены функции, приводите строку к числу:))
1 фев 16, 17:09    [18757829]     Ответить | Цитировать Сообщить модератору
 Re: Оператор IIF неверно отрабатывает условие.  [new]
ForspaMail
Member

Откуда:
Сообщений: 6
WarAnt
ForspaMail,

Вы мазохист или у вас принцип использовать всегда и везде только одну функцию для всех случаешь жизни?:))
вам наверное постов 10 назад сказали, чтобы вы заменили DATENAME на DATEPART, но вы явно раньше служили где нить в вдв, раз вместо замены функции, приводите строку к числу:))

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

PS.
Подскажите самый удобный способ узнать какой по счету день заданной даты от начала года.
например:
3 февраля 2010 года это 34-й день от начала года.
12 апреля 2015 года это 102-й день от начала года.
2 фев 16, 14:31    [18762130]     Ответить | Цитировать Сообщить модератору
 Re: Оператор IIF неверно отрабатывает условие.  [new]
Glory
Member

Откуда:
Сообщений: 104751
ForspaMail
Подскажите самый удобный способ узнать какой по счету день заданной даты от начала года.

Самый удобный для чего ?
Для вашей следующей задачи в процессе вашего дальнейшего обучения ?

ЗЫ
Вы кстати попросили включить в программу тему о разных типах данных и особенностях их сравнения ?
2 фев 16, 14:34    [18762164]     Ответить | Цитировать Сообщить модератору
 Re: Оператор IIF неверно отрабатывает условие.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ForspaMail
(в целях обучения),

неплохо начинать чичтать хелп DATEPART
2 фев 16, 14:36    [18762173]     Ответить | Цитировать Сообщить модератору
 Re: Оператор IIF неверно отрабатывает условие.  [new]
ForspaMail
Member

Откуда:
Сообщений: 6
Спасибо всем за ответы.
Прошу считать тему закрытой.
2 фев 16, 14:41    [18762220]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить