Here's a SELECT - you can wrap an INSERT or UPDATE etc around it to populate your table. I'm sure there are other (maybe better ways) of doing this too :)
DECLARE @START DATETIME = '04:15:00';
DECLARE @END DATETIME = '13:50:00';
DECLARE @VALUE INT = 2;
WITH Numbers(N) AS
(
SELECT 0 N
UNION ALL
SELECT N+1 N FROM Numbers
WHERE N<23
)
SELECT * FROM (
SELECT CONCAT('Hour',N) Period, CASE WHEN N BETWEEN DATEPART(HOUR, @START) AND DATEPART(HOUR, @END) THEN @VALUE ELSE 0 END VALUE FROM Numbers
) SRC
PIVOT
(
MAX(VALUE) FOR Period IN ([Hour0],[Hour1],[Hour2],[Hour3],[Hour4],[Hour5],[Hour6],[Hour7],[Hour8],[Hour9],[Hour10],[Hour11],[Hour12],[Hour13],[Hour14],[Hour15],[Hour16],[Hour17],[Hour18],[Hour19],[Hour20],[Hour21],[Hour22],[Hour23])
) Pvt
Hour0 Hour1 Hour2 Hour3 Hour4 Hour5 Hour6 Hour7 Hour8 Hour9 Hour10 Hour11 Hour12 Hour13 Hour14 Hour15 Hour16 Hour17 Hour18 Hour19 Hour20 Hour21 Hour22 Hour23
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
0 0 0 0 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0
(1 row(s) affected)
EDIT: Hint on wrapping this with an insert (untested) See Combining INSERT INTO and WITH/CTE
WITH Numbers(N) AS
(
SELECT 0 N
UNION ALL
SELECT N+1 N FROM Numbers
WHERE N<23
)
INSERT INTO MyTable
(
Hour0,
Hour1,
-- etc ...
)
SELECT * FROM (
SELECT CONCAT('Hour',N) Period, CASE WHEN N BETWEEN DATEPART(HOUR, @START) AND DATEPART(HOUR, @END) THEN @VALUE ELSE 0 END VALUE FROM Numbers
) SRC
PIVOT
(
MAX(VALUE) FOR Period IN ([Hour0],[Hour1],[Hour2],[Hour3],[Hour4],[Hour5],[Hour6],[Hour7],[Hour8],[Hour9],[Hour10],[Hour11],[Hour12],[Hour13],[Hour14],[Hour15],[Hour16],[Hour17],[Hour18],[Hour19],[Hour20],[Hour21],[Hour22],[Hour23])
) Pvt
Regarding your comment on compatibility levels and PIVOT
:
Is PIVOT supported with compatibility_level 80?