Дата Логика Вопрос - PullRequest
       18

Дата Логика Вопрос

0 голосов
/ 02 ноября 2010

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

** Таблица Биллера

Клиент Josh & Co.

Коммунальная компания A

Потребитель # ............... AL12111
Дата создания счета ... 07-го числа каждого месяца
Дата оплаты счета ........... 18 числа каждого месяца
Дата отсечения моего банка .. 12 числа каждого месяца

Теперь на экране генерации счета я принимаю следующие данные:

Consumer # ...... AL12111

Дата ввода счета-фактуры. 29-10-2010 (поле «Только для чтения», системная дата)

Клиент .... Josh & Co.

Месяц выставления счета.... Октябрь

Сумма к оплате ... 5000 долларов США

Теперь моя проблема заключается в том, как мне определить, генерирует ли бухгалтер счет до наступления срока платежа или нет, но в таблице счетов-фактур яУ вас нет месяца и года, только дата месяца.

Буду признателен за помощь и совет.

спасибо

Ответы [ 2 ]

2 голосов
/ 02 ноября 2010

Это не вопрос SQL Server или даже вопрос программирования - это бизнес-вопрос, на который может ответить только ваш бизнес-аналитик / заинтересованная сторона.

Чтобы развернуть, у вас есть дата ввода yyyy-mm-dd (давайте назовем это dt_entry, datetime) и день месяца, к которому причитается счет, давайте назовем это d (целое число).

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

Таким образом, срок выполнения в форме даты будет dt_entry - DAY (dt_entry) + d (дата-время SQL Server может использовать простое целочисленное сложение для дней, нет необходимости в DATEADD).

Вы можете увидеть, где это вызовет проблему ближе к концу месяца, потому что d будет маленьким (скажем, 1), а дата входа будет большой (скажем, 31), а затем гипотетическая дата истечения действительно следующий месяц. Но что, если человек платит очень рано (например, 5-го за дату платежа 25-го)?

Кроме того, вам может понадобиться рассмотреть короткие месяцы, поскольку в феврале не может быть 31 февраля.

Все это проблемы программирования, на которые есть только бизнес-ответы.

0 голосов
/ 02 ноября 2010

CREATE PROCEDURE [sp_BillDateCheck]
@CURMONTH VARCHAR (3),
@MONTHNUM INT OUTPUT,
@EBDATEMATCH VARCHAR (90) ВЫХОД
AS
НАЧАТЬ
ОБЪЯВИТЬ @ENTRYDATE DATETIME
SELECT @ENTRYDATE = GETDATE () - ПОЛУЧИТЬ ТЕКУЩУЮ ДАТУ ВХОДА

- ПОЛУЧИТЕ НОМЕР МЕСЯЦА, ДАВАЯ НАЗВАНИЕ МЕСЯЦА
ВЫБЕРИТЕ @MONTHNUM = DATEPART (мм, CAST (@CURMONTH + '1900' AS DATETIME))

IF DATEPART (MONTH, @ENTRYDATE) = @ MONTHNUM
ВЫБЕРИТЕ @EBDATEMATCH = 'ДАТА ВХОДА И МЕСЯЦ БИЛЛИНГА ОДИНАКОВЫ' '

ЕСЛИ DATEPART (MONTH, @ENTRYDATE) <@ MONTHNUM <br> SELECT @EBDATEMATCH = 'ДАТА ВХОДА МЕНЬШЕ, ЧЕМ МЕСЯЦ БИЛЛИНГА'

ЕСЛИ DATEPART (MONTH, @ENTRYDATE)> @ MONTHNUM
SELECT @EBDATEMATCH = 'ДАТА ВХОДА БОЛЬШЕ, ЧЕМ МЕСЯЦ БИЛЛИНГА'
END
GO`

спасибо JNK за ​​подсказку DATEPART. Я точно не писающий мозг

...