Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Работа с датами в MS SQL Server

Михаил Гавриленко Ученик (174), на голосовании 1 год назад
Не могу понять как реализовать функцию уже вторую неделю в MS SQL Server. Она должна получать строку в которой могут содержаться любые символы, в том числе и даты. Функция должна проверить чтобы количество дат было не меньше 4, а также разность всевозможных комбинаций пар этих дат не должна привышать 21 день. Если всё правильно, то функция воозвращает 1, если нет, то 0.
Голосование за лучший ответ
Ярослав Перфильев Просветленный (23330) 1 год назад
наколхозили походу в самом коде php
Денис Романов Знаток (375) 1 год назад
CREATE FUNCTION CheckDates(@inputString NVARCHAR(MAX))
RETURNS BIT
AS
BEGIN
DECLARE @dateCount INT = 0;
DECLARE @datePairs TABLE (date1 DATETIME, date2 DATETIME);
DECLARE @currentPosition INT = 1;
DECLARE @maxDateDiff INT = 21;

WHILE @currentPosition <= LEN(@inputString)
BEGIN
DECLARE @substring NVARCHAR(MAX) = SUBSTRING(@inputString, @currentPosition, LEN(@inputString));
DECLARE @dateFound BIT = 0;

IF TRY_CONVERT(DATETIME, @substring) IS NOT NULL
BEGIN
SET @dateFound = 1;
SET @dateCount = @dateCount + 1;
END

IF @dateFound = 1
BEGIN
DECLARE @position2 INT = @currentPosition + 1;

WHILE @position2 <= LEN(@inputString)
BEGIN
DECLARE @substring2 NVARCHAR(MAX) = SUBSTRING(@inputString, @position2, LEN(@inputString));
DECLARE @dateFound2 BIT = 0;

IF TRY_CONVERT(DATETIME, @substring2) IS NOT NULL
BEGIN
SET @dateFound2 = 1;
END

IF @dateFound2 = 1
BEGIN
INSERT INTO @datePairs (date1, date2)
VALUES (CAST(@substring AS DATETIME), CAST(@substring2 AS DATETIME));
END

SET @position2 = @position2 + 1;
END
END

SET @currentPosition = @currentPosition + 1;
END

IF @dateCount >= 4 AND NOT EXISTS (
SELECT * FROM @datePairs
WHERE DATEDIFF(DAY, date1, date2) > @maxDateDiff
)
BEGIN
RETURN 1;
END
ELSE
BEGIN
RETURN 0;
END
END
АI Мыслитель (8354) 1 год назад
функции, которая реализует описанный алгоритм:
 CREATE FUNCTION CheckDates(@inputString NVARCHAR(MAX)) 
RETURNS BIT
AS
BEGIN
DECLARE @dateRegex NVARCHAR(MAX) = '[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}'
DECLARE @dateCount INT = (SELECT COUNT(*) FROM dbo.fn_SplitString(@inputString, N' ') WHERE PATINDEX(@dateRegex, value) > 0)

IF @dateCount < 4
RETURN 0

DECLARE @datePairs TABLE (date1 DATE, date2 DATE)
INSERT INTO @datePairs
SELECT d1.dateValue, d2.dateValue
FROM (SELECT CAST(value AS DATE) AS dateValue FROM dbo.fn_SplitString(@inputString, N' ') WHERE PATINDEX(@dateRegex, value) > 0) d1
CROSS JOIN (SELECT CAST(value AS DATE) AS dateValue FROM dbo.fn_SplitString(@inputString, N' ') WHERE PATINDEX(@dateRegex, value) > 0) d2
WHERE d1.dateValue < d2.dateValue

IF EXISTS (SELECT 1 FROM @datePairs WHERE DATEDIFF(DAY, date1, date2) > 21)
RETURN 0

RETURN 1
END
Михаил ГавриленкоУченик (174) 1 год назад
При вводе строки '1/1/2022ejiecje1/1/2022dicwidu1/1/2022lddd1/1/2022' выдаёт ошибку хотя тут есть 4 даты, а их разность равна 0
Похожие вопросы