2014-12-30 5 views
0

Могу ли я использовать GetDate и DateAdd в операторе SQL Query Select Case? Часть моего запроса выглядит следующим образом, но только возвращает OVER60 в результате независимо от даты рождения Клиента. Есть ли лучший способ сделать это? Я новичок в этом, и это мой первый вопрос для Stack Overflow, поэтому я благодарю вас за любую проницательность.sql query case dateadd

SELECT G.ClientID, CONVERT(VARCHAR(10), ClientDob, 101) AS ClientDob 
, CASE 
     WHEN (G.ClientDob > GETDATE() AND G.ClientDob < dateadd(year, -13, GetDate()))THEN 'Under13' 
     WHEN (G.ClientDob >= DATEADD(YEAR, -13, GETDATE()) AND G.ClientDob < DATEADD(year, -20, GETDATE()))THEN '13-19' 
     WHEN (G.ClientDob >= DATEADD(Year, -20, GETDATE()) AND G.ClientDob < DATEADD(Year, -30, GETDATE())) THEN '20-29' 
     WHEN (G.ClientDob >= DATEADD(YEAR, -30, GETDATE()) AND G.ClientDob < DATEADD(YEAR, -45, GETDATE())) THEN '30-44' 
     WHEN (G.ClientDob >= DATEADD(Year, -45, GETDATE()) AND G.ClientDob < DATEADD(YEAR, -60, GETDATE())) THEN '45-59' 
     Else 'OVER60' 
END AS AgeCategory 
+2

Вы уверены, что это mysql? возможно, ms sql server? –

+0

не должен 'G.ClientDob ​​ dateadd (год, -13, GetDate()))' dob 1/1/2014 <12/30/2014 да. 1/1/2014 <(1/1/2014-13) Нет ... так что теперь ни один из них не правдоподобен. Проще говоря логическая ошибка <должна быть> на второй эвале. – xQbert

+0

Да, возможно, но я думаю, что у вас есть> и <назад. –

ответ

0

Предполагая, что SQL Server, несмотря на MySQL теге Это следует сделать это:

SELECT G.ClientID, CONVERT(VARCHAR(10), ClientDob, 101) AS ClientDob 
, CASE 
    WHEN (G.ClientDob > dateadd(year, -13, GetDate()))THEN 'Under13' 
    WHEN (G.ClientDob > DATEADD(year, -20, GETDATE()))THEN '13-19' 
    WHEN (G.ClientDob > DATEADD(Year, -30, GETDATE())) THEN '20-29' 
    WHEN (G.ClientDob > DATEADD(YEAR, -45, GETDATE())) THEN '30-44' 
    WHEN (G.ClientDob > DATEADD(YEAR, -60, GETDATE())) THEN '45-59' 
    Else 'OVER60' 
END AS AgeCategory 

Вы были < и > путаницы, также нет необходимости отрицая предыдущие критерии в последующих WHEN критериев, первый критерий соответствия используется, и никто другой не оценивается.

Примечание: как указано в xQbert, вышеуказанное не предполагает, что будущие даты рождения не существуют, если в ваших данных могут существовать будущие дни рождения (их нельзя допускать imo), вы бы хотели обработать их явно.

+2

Это пропускает элемент. Люди с будущими датами рождения попадают в другие примеры OP, вероятно, ошибочные. Это они упадут ниже 13. Вероятно, необходимо уточнить, принадлежат ли они к результатам вообще – xQbert

+0

@ xQbert хорошая точка, добавлено примечание. Будущие даты рождения не должны быть разрешены imo, но мы не можем всегда контролировать, какие данные мы заканчиваем. –

+0

Да, я согласен с вами в том, что данных не должно существовать .. как можно иметь дату рождения в будущем, это еще не «факт». но поскольку OP явно рассматривал этот случай, мы, вероятно, должны уточнить. – xQbert