这是我的程序:
ALTER PROCEDURE [dbo].[sp_ETL Populate Dim Date]
@start_date NVARCHAR(10) = N'2009-01-01',
@end_date NVARCHAR(10) = N'2010-12-31'
AS
TRUNCATE TABLE [STG Dim Date]
Declare
@Date date,
@endDate date,
@IsLeapYear BIT,
@IsWeekend BIT
Set @Date = @start_date
Set @endDate = @end_date
-- Loop through dates until end date
WHILE @Date <=@endDate
BEGIN
LINENO 0
-- Check for leap year
IF ((Year(@Date) % 4 = 0) AND (Year(@Date) % 100 != 0 OR Year(@Date) % 400 = 0))
BEGIN
SELECT @IsLeapYear = 1
END
ELSE
BEGIN
SELECT @IsLeapYear = 0
END
-- Check for weekend
IF (DATEPART(dw, @Date) = 6 OR DATEPART(dw, @Date) = 7)
BEGIN
SELECT @IsWeekend = 1
END
ELSE
BEGIN
SELECT @IsWeekend = 0
END
-- Insert data in dim date table
INSERT Into [Baraam Retail STG].[dbo].[STG Dim Date]
(
[DateKey],
[Date],
[DateString],
[DayofMonth],
[DayofYear],
[DayofWeek],
[DayofWeeknameENG],
[DayofWeeknameHEB],
[Week],
[Month],
[MonthNameENG],
[MonthNameHEB],
[MonthYear],
[Qrt],
[Qrt Name],
[Year],
[IsWeekend],
[IsLeapYear]
)
Values
(
YEAR(@Date)*10000+MONTH(@Date)*100+DAY(@Date), -- DateKey | yyyymmdd
@Date, -- Date | yyyy-mm-dd
CONVERT(nvarchar(10), @Date, 105), -- DateString | dd-mm-yyyy
Day(@Date), -- Day of Month | 1-31
DATEPART(dy, @Date), -- Day of Year
DATEPART(dw, @Date), -- Day of Week
DATENAME(dw, @Date), -- English Day of Week Name
CASE DATEPART(dw, @Date) -- Hebrew Day of Week Name
WHEN 1 THEN N'ראשון'
WHEN 2 THEN N'שני'
WHEN 3 THEN N'שלישי'
WHEN 4 THEN N'רביע'
WHEN 5 THEN N'חמישי'
WHEN 6 THEN N'שישי'
WHEN 7 THEN N'שבת'
END,
DATEPART(wk, @Date), -- Week of Year
DATEPART(mm, @Date), -- Month of Year | 1-12
DATENAME(mm, @Date), -- English Month of Year Name
CASE DATEPART(mm, @Date) -- Hebrew Month of Year Name
WHEN 1 THEN N'ינואר'
WHEN 2 THEN N'פברואר'
WHEN 3 THEN N'מרצ'
WHEN 4 THEN N'אפריל'
WHEN 5 THEN N'מאי'
WHEN 6 THEN N'יוני'
WHEN 7 THEN N'יולי'
WHEN 8 THEN N'אוגוסט'
WHEN 9 THEN N'ספטמבר'
WHEN 10 THEN N'אוקטובר'
WHEN 11 THEN N'נובמבר'
WHEN 12 THEN N'דצמבר'
END,
CONCAT(RIGHT(('0'+CAST(MONTH(@Date)AS VARCHAR(2))),2),'-',YEAR(@Date)), -- Month Year | mm-yyyy
DATENAME(qq, @Date), -- Qrt
CASE DATEPART(qq, @Date) -- Qrt Name
WHEN 1 THEN N'Q-1'
WHEN 2 THEN N'Q-2'
WHEN 3 THEN N'Q-3'
WHEN 4 THEN N'Q-4'
END,
Year(@Date),
@IsWeekend,
@IsLeapYear
)
-- Step to next day
SET @Date = DATEADD(dd, 1, @Date)
END
-- Join Holidays
UPDATE [Baraam Retail STG].[dbo].[STG Dim Date]
SET
[HolidayName] = ISNULL([Baraam Retail STG].[dbo].[STG Hashing Holidays].[Period], N'יום חול'),
[IsHoliday] =
CASE WHEN [Baraam Retail STG].[dbo].[STG Hashing Holidays].[Period] IS NULL
THEN 0
ELSE 1
END
FROM [STG Dim Date] LEFT JOIN [Baraam Retail STG].[dbo].[STG Hashing Holidays]
ON [STG Dim Date].[Date] BETWEEN [STG Hashing Holidays].[Begining] AND [STG Hashing Holidays].[End]基本上,proc会得到一个开始日期和结束日期。它填充一个Dim日期表。
我正在通过这个脚本执行它:
EXEC [sp_ETL Populate Dim Date]
@start_date = '2009-01-01',
@end_date = '2010-12-31'我收到一条错误消息:
Msg 241,级别16,状态1,过程sp_ETL填充Dim日期,第20行批处理开始行0转换失败时,转换日期和/或时间从字符串。
我使用这个脚本来创建Dim日期表:
CREATE TABLE [Baraam Retail STG].[dbo].[STG Dim Date]
(
[DateKey] INT,
[Date] DATE,
[DateString] DATE,
[DayofMonth] BIT,
[DayofYear] SMALLINT,
[DayofWeek] TINYINT,
[DayofWeeknameENG] VARCHAR(10),
[DayofWeeknameHEB] VARCHAR(10),
[Week] TINYINT,
[Month] TINYINT,
[MonthNameENG] VARCHAR(10),
[MonthNameHEB] VARCHAR(10),
[MonthYear] CHAR(7),
[Qrt] TINYINT,
[Qrt Name] CHAR(7),
[Year] SMALLINT,
[IsWeekend] BIT,
[IsLeapYear] BIT,
[IsHoliday] BIT,
[HolidayName] VARCHAR(50)
)通过检查Dim日期表中的输出,proc启动并循环12个日期(2019-01-01至2019-01- 12 )。所有输出都是正确的。它停在2019年-01-13号。我为每个计算创建了一个print命令,它似乎运行得很好。
我的SSMS版本没有调试器。所以我不能用它来调试问题。
你认为如何?
发布于 2020-04-11 17:08:50
问题是分配表达式
CONVERT(nvarchar(10), @Date, 105)到DATESTR字段。这里还不清楚您想要完成什么,但是SQL server不一定能够将此字符串解析为日期。
https://stackoverflow.com/questions/61160130
复制相似问题