Maideen Abdul Kader Ответов: 4

Как получить даты между двумя датами?


Привет
Извините, я не знаю, как написать вопрос/тему для следующего запроса, а также плохой английский..

У меня есть проблема, которая есть.
У меня есть две даты, такие как 2017-07-29-2017-08-02 = 5 дней
в двух столбцах (dateFrom и DateTo) в таблице.

Мне нужно написать еще одну таблицу, подобную этой, из предыдущей таблицы, используя asp.net или хранимая процедура. Я использую MSSQL 2014 + ASP.Net

2017-07-29
2017-07-30
2017-07-31
2017-08-01
2017-08-02

Пожалуйста, посоветуйте мне, как это сделать

Заранее благодарю вас

Мейден

Что я уже пробовал:

;with CTE_No as
(
    select 0 as NoAux
	union all
	select NoAux + 1 from CTE_No where NoAux < 300
)

INSERT INTO [dbo].[OP_Leave_Date]([Code],[Name],[Datefrom])

SELECT [Code],[Name],[Datefrom] + NOAUX
FROM [dbo].[OP_LeaveApplication] CROSS JOIN CTE_No
WHERE Datefrom + NOAUX <= Dateto 
OPTION (MAXRECURSION 0);

Andy Lanng

По-моему, все в порядке. Никакая ошибка

Maideen Abdul Kader

Спасибо

Я закончил с ошибкой :
Msg 206, Уровень 16, состояние 2, процедура usp_OP_Leave_Date, строка 13
Столкновение типов операндов: дата несовместима с int

Пожалуйста, посоветуйте мне.

PIEBALDconsult

И что же?

Maideen Abdul Kader

закончилось ошибкой

Я закончил с ошибкой :
Msg 206, Уровень 16, состояние 2, процедура usp_OP_Leave_Date, строка 13
Столкновение типов операндов: дата несовместима с int

PIEBALDconsult

Дата из + NOAUX

Попробуйте DATEADD ?

4 Ответов

Рейтинг:
29

Andy Lanng

Я пробовал это с dateadd и без него, и это работает в обоих направлениях. Проблема может быть в той версии sql server, на которой вы находитесь. Это не имеет значения, просто используйте dateadd, как показано ниже:


;with CTE_No as
(
    select 0 as NoAux
	union all
	select NoAux + 1 from CTE_No where NoAux < 300
) , 
--test data
[OP_LeaveApplication] as (
SELECT 1 [Code],'one' [Name], cast('29 jul 2017' as datetime) [Datefrom],  cast('02 aug 2017' as datetime) [Dateto]
) 
 
 
SELECT [Code],[Name],dateadd(day,noaux, [Datefrom])
FROM [OP_LeaveApplication] CROSS JOIN CTE_No
WHERE dateadd(day,noaux, [Datefrom]) <= Dateto 
OPTION (MAXRECURSION 0);


Рейтинг:
20

Maideen Abdul Kader

Спасибо всем

Совет от PIEBALDconsult

Я использовал DATEADD. Сейчас все работает нормально. Это код

;with CTE_No as
(
    select 0 as NoAux
	union all
	select NoAux + 1 from CTE_No where NoAux < 300
)

INSERT INTO [dbo].[OP_Leave_Date]([Code],[Name],[Datefrom],dateto,nodays,id,typeleave)

SELECT [Code],[Name],dateadd(d,NOAUX,[Datefrom]),dateto,nodays,id,typeleave  
FROM [dbo].[OP_LeaveApplication] CROSS JOIN CTE_No
WHERE dateadd(d,NOAUX,Datefrom)  <= dateto 
OPTION (MAXRECURSION 0);


Спасибо

Мейден


Рейтинг:
2

radha patil

Hi try this
<pre>insert into Table1(todate, Catname)
SELECT        CatName, Dateadded
FROM                          TblCat where dateadded between convert(datetime, '6/7/2017 ', 101)   and convert(datetime, '6/8/2017  ', 101) 


Рейтинг:
0

Member 13339456

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

Изменить процедуру [dbo].[Fetch_SellerInfo]


@PostdateFrom datetime=null,
@Postdateto datetime=null,

АС
НАЧАТЬ


выбирать
Собственность.PropertyDetailsId,Проставить Дату

От
PropertyDetails


где

(@PostdateFrom null и @Postdateto имеет значение null или переноса на более поздние строки между
@PostdateFrom и @Postdateto )
И
собственность.Delflag=0