ZohaibRazaTheDProgrammer Ответов: 2

Как перебирать дату в качестве параметра SQL-запроса?


Привет,

Мой запрос TRANSACT SQL принимает @Start_Date='2016-06-3 13:46:25.370' в качестве параметра и возвращает результаты:

ColA	ColB	ColC
'2016-06-3 13:46:25.370'	B	C


Я хочу передать еще один параметр @End_Date='2016-06-5 13:46:25.370' и получите результат:

ColA	ColB	ColC
'2016-06-3 13:46:25.370'	B	C
'2016-06-4 13:46:25.370'	B	C
'2016-06-5 13:46:25.370'	B	C

В принципе, я пытаюсь перебирать даты в качестве параметра.

Мой SQL-запрос таков:

DECLARE @Start_Date as Datetime='2016-06-3 13:46:25.370', @End_Date as datetime='2016-06-3 13:46:25.370'
SELECT @Start_Date [ColA], 'B' [ColB], 'C' [ColC] 

Любая помощь будет высоко оценена.

2 Ответов

Рейтинг:
4

Maciej Los

Если вы ищете решение для "создания" некоторой части данных, имеющих две даты в качестве входных параметров, вас могут заинтересовать КТОС[^].

DECLARE @Start_Date DATETIME ='2016-06-03 13:46:25.370'
DECLARE @End_Date DATETIME ='2016-06-05 13:46:25.370'

;WITH MyDates AS
(
	SELECT @Start_Date AS MyDate
	UNION ALL
	SELECT DATEADD(DD,1, MyDate) AS MyDate
	FROM MyDates
	WHERE DATEADD(DD,1, MyDate)<=@End_Date
)
SELECT *
FROM MyDates
--OPTION(MAXRECURSION 0) --uncomment this lie, if the count of dates exceedes 100


Результат:
MyDate
2016-06-03 13:46:25.370
2016-06-04 13:46:25.370
2016-06-05 13:46:25.370


ZohaibRazaTheDProgrammer

@Maciej Los you query работает потрясающе, но он показывает мне синтаксическую ошибку, когда я пытаюсь сделать это таким образом:
(
Выберите @Start_Date в качестве MyDate, ColA из A_Table
СОЮЗ ВСЕХ
Выберите DATEADD(DD, 1, MyDate) в качестве MyDate, ColB из B_Table
Из MyDates
Где DATEADD(DD, 1, MyDate)<=@End_Date
)
Можете ли вы пожалуйста, помогите мне изменить этот запрос, чтобы мой лучший использовать. - Привет

Maciej Los

Что ж... Ты делаешь это неправильно. Вы должны присоединиться к ColA и ColB в конце заявления, сразу после второго ")":
SELECT md.MyDate, a.ColA, b.ColB
FROM MyDate AS md
INNER JOIN TableA AS a ON md.MyDate = a.OtherDateField
INNER JOIN TableB AS b ON md.MyDate = b.AnotherDateField

Рейтинг:
2

OriginalGriff

Попробуй:

SELECT * FROM MYTable WHERE MyDateColumn BETWEEN @Start_Date AND @End_Date

Но... Если это ваши значения столбцов и вы храните даты в Столбцах VARCHAR или NVARCHAR, то сначала вам нужно это исправить. Никогда не храните даты (или что - либо еще, кроме подлинных строковых значений, таких как имена и адреса) в строковых столбцах-это создает огромные проблемы позже, когда вы пытаетесь использовать их, потому что порядок строк основан на первом различном символе в двух строках.


ZohaibRazaTheDProgrammer

@OriginalGriff если вы можете прочитать мой запрос, я не запускаю запрос ни в одной таблице, и там нет столбца, содержащего даты. - Привет