2015-08-21 2 views
-5

У меня есть таблица, в которой хранятся даты истечения срока действия кредитных карт, ниже приведен пример схемы для таблицы.проверить карты истечения срока действия

ExpiryDate Varchar(10) 

Образец данных в таблице выглядит следующим образом: -

'08/10' 
'09/11' 
'08/16' 
'10/17' 

, как я могу узнать, если датировать карты истек?

+0

Я не совсем понимаю, что здесь задает вопрос? Вы хотите знать, из строки типа '08/10 ', как вы переводите ее в другое представительство августа 2010 года? – Jim

+0

Можете ли вы изменить структуру таблицы, чтобы у вас была дата вместо строки? Хранение информации о дате в строках, подобных вам, - это кошмар, с которым приходится иметь дело. –

+0

Ваш вопрос непонятен. Покажите нам, что вы сделали и каков ваш ожидаемый результат. –

ответ

-1

Я думаю, что вы хотите:

SELECT TOP 4 * 
FROM BillingInfo 
WHERE ExpiryDate in ('08/10','09/11','08/16','10/17') 

Найдет вас 4 пунктов с этими датами.

+0

nope, я пытался узнать карты, срок действия которых истек с использованием даты истечения срока действия. – Nick

+2

, чтобы вы хотели знать, как перевести дату, отформатированную как этот тип строки, в дату для сравнения с GETDATE()? – Hogan

+0

Если это так, скажите мне. Но не уменьшайте мой ответ, когда ваш вопрос не ясен. У меня нет НИКАКОЙ заинтересованности в том, чтобы помочь вам решить эту проблему сейчас. – Hogan

2

Я не уверен, что вы ожидали, но Вы можете использовать манипуляции со строками с подстрокой, чтобы получить записи тех, которые не истекли

Select * 
FROM supportContacts 
WHERE LEFT(ExpiryDate,2) >= MONTH(GETDATE()) AND RIGHT(ExpiryDate,2) >= RIGHT(YEAR(GETDATE()),2) 

Если вы хотите, то истек список карт использовать этот

Select * 
FROM supportContacts 
WHERE LEFT(ExpiryDate,2) < MONTH(GETDATE()) AND RIGHT(ExpiryDate,2) <= RIGHT(YEAR(GETDATE()),2) 

SQL DEMO

+0

Это сработало ... Спасибо HavenoDisplayName – Nick

+0

@ Ник - правда? Мне кажется, что это приведет к тому, что счета еще не истекли. – APH

0

Вы хотите что-то вроде этого:

select * from BillingInfo 
where 
    cast(left(expiryDate, 2) as int) --take the month portion of the expiry date 
    < select datepart(mm, getdate()) --expiry month must be before current month 
and 
    cast(right(expiryDate, 2) as int) --take the year portion of the expiry date 
    <= select datepart(yy, getdate()) % 1000 --expiry year must also be during or before current year 

% 1000 преобразует год в двузначный формат.

+0

'% 1000' возвращает 1 цифру, если год был между 2000 и 2009 годами, включая. –

+0

Хороший вопрос - я редактировал для преобразования varchars в ints, хотя я думаю, что в целом это не изменит ситуацию. – APH

0
select * 
from billinginfo 
where substring(expirydate,1,charindex('/',expirydate)-1) < month(getdate()) 
and '20'+ substring(expirydate,charindex('/',expirydate)+1, 2) <= year(getdate()) 

Вы можете попробовать это.

0

С такой ужасной структурой данных вы вынуждены смешать это вместе. Вот один из способов сделать это.

with BadData as 
(
    select '08/10' as SemiDate union all 
    select '09/11' union all 
    select '08/16' union all 
    select '10/17' 
) 

select * 
from BadData 
where cast(replace(STUFF(SemiDate, 4, 0, '01-20'), '/', '-') as DATE) < CAST(getdate() as DATE) 

Если вы сохранили ExpirationDate в качестве даты вместо строки, это было бы просто. Надеюсь, вы не сохраните номер кредитной карты рядом с этим.

Смежные вопросы