创建一个日历日 table
Create a calendar day table
我正在尝试编写一个代码,我可以在其中插入一个日期,下面的 table 将使用 CD1(日历日)中特定月份的所有日期填充预期日期 table 1) 一直到 CD30 或 CD31 或二月情况下 CD28。我知道我应该以
之类的内容开始我的代码
Declare @startdate as datetime
Set @startdate = '20170401'
但在那之后我对创建此查询以生成结果的 DateAdd 和 DatePart 代码感到困惑
date rule | expected date |
----------------------------
| CD1 | 4/1/2017 |
| CD2 | 4/2/2017 |
| CD3 | 4/3/2017 |
| CD4 | 4/4/2017 |
| CD5 | 4/5/2017 |
| CD6 | 4/6/2017 |
谁能提供帮助?
DECLARE @startdate datetime = '2017-04-01'
DECLARE @startdate_for_loop datetime
SET @startdate_for_loop = @startdate
CREATE TABLE #T (date_rule nvarchar(100), exp_date datetime)
declare @x int = 1
WHILE MONTH(@startdate) = MONTH(@startdate_for_loop)
BEGIN
INSERT INTO #T VALUES ('CD' + CAST(@x as nvarchar(max)), @startdate_for_loop)
SET @x = @x + 1
SET @startdate_for_loop = DATEADD(DD, 1, @startdate_for_loop)
END
SELECT * FROM #T
尝试以下查询,这将为您提供所需的输出:
DECLARE @STARTDATE DATETIME
SET @STARTDATE= CAST(MONTH(CURRENT_TIMESTAMP) AS VARCHAR(100))+'/'+'01'+'/'+CAST(YEAR(CURRENT_TIMESTAMP) AS VARCHAR(100))
;WITH MONTHDATA
AS
(SELECT @STARTDATE MONTHDATE
UNION ALL
SELECT DATEADD(D,1,MONTHDATE) FROM MONTHDATA WHERE MONTHDATE<DATEADD(D,-1,DATEADD(M,1,@STARTDATE))
)
SELECT 'CD'+CAST( (ROW_NUMBER()OVER (ORDER BY MONTHDATE)) AS VARCHAR(100))DATE_RULE,CONVERT(VARCHAR,MONTHDATE,101)MONTHDATE FROM MONTHDATA
输出
----------------------
DATE_RULE MONTHDATE
----------------------
CD1 03/01/2017
CD2 03/02/2017
CD3 03/03/2017
.
.
.
CD29 03/29/2017
CD30 03/30/2017
CD31 03/31/2017
----------------------
试试这个,
Declare @startdate as datetime
Set @startdate = '20170401'
;with cte as
(
select @startdate dt,1 ruleid
union ALL
select dateadd(day,1,dt)
,ruleid+1
from cte
where
dt<dateadd(day,-1,dateadd(month, datediff(month,0,@startdate)+1,0))
)
select *,'CD'+cast(ruleid as varchar) CalenderRule
from cte
我正在尝试编写一个代码,我可以在其中插入一个日期,下面的 table 将使用 CD1(日历日)中特定月份的所有日期填充预期日期 table 1) 一直到 CD30 或 CD31 或二月情况下 CD28。我知道我应该以
之类的内容开始我的代码Declare @startdate as datetime
Set @startdate = '20170401'
但在那之后我对创建此查询以生成结果的 DateAdd 和 DatePart 代码感到困惑
date rule | expected date | ---------------------------- | CD1 | 4/1/2017 | | CD2 | 4/2/2017 | | CD3 | 4/3/2017 | | CD4 | 4/4/2017 | | CD5 | 4/5/2017 | | CD6 | 4/6/2017 |
谁能提供帮助?
DECLARE @startdate datetime = '2017-04-01'
DECLARE @startdate_for_loop datetime
SET @startdate_for_loop = @startdate
CREATE TABLE #T (date_rule nvarchar(100), exp_date datetime)
declare @x int = 1
WHILE MONTH(@startdate) = MONTH(@startdate_for_loop)
BEGIN
INSERT INTO #T VALUES ('CD' + CAST(@x as nvarchar(max)), @startdate_for_loop)
SET @x = @x + 1
SET @startdate_for_loop = DATEADD(DD, 1, @startdate_for_loop)
END
SELECT * FROM #T
尝试以下查询,这将为您提供所需的输出:
DECLARE @STARTDATE DATETIME
SET @STARTDATE= CAST(MONTH(CURRENT_TIMESTAMP) AS VARCHAR(100))+'/'+'01'+'/'+CAST(YEAR(CURRENT_TIMESTAMP) AS VARCHAR(100))
;WITH MONTHDATA
AS
(SELECT @STARTDATE MONTHDATE
UNION ALL
SELECT DATEADD(D,1,MONTHDATE) FROM MONTHDATA WHERE MONTHDATE<DATEADD(D,-1,DATEADD(M,1,@STARTDATE))
)
SELECT 'CD'+CAST( (ROW_NUMBER()OVER (ORDER BY MONTHDATE)) AS VARCHAR(100))DATE_RULE,CONVERT(VARCHAR,MONTHDATE,101)MONTHDATE FROM MONTHDATA
输出
----------------------
DATE_RULE MONTHDATE
----------------------
CD1 03/01/2017
CD2 03/02/2017
CD3 03/03/2017
.
.
.
CD29 03/29/2017
CD30 03/30/2017
CD31 03/31/2017
----------------------
试试这个,
Declare @startdate as datetime
Set @startdate = '20170401'
;with cte as
(
select @startdate dt,1 ruleid
union ALL
select dateadd(day,1,dt)
,ruleid+1
from cte
where
dt<dateadd(day,-1,dateadd(month, datediff(month,0,@startdate)+1,0))
)
select *,'CD'+cast(ruleid as varchar) CalenderRule
from cte