4-4-5 учетные периоды - проклятие моего существования - PullRequest
0 голосов
/ 27 августа 2009

Мы используем 4-4-5 учетных периодов. Если вы не знакомы с этим, вы можете найти информацию в Wikipedia .

Для этого я создал таблицу дат со всеми днями на следующие 10 лет. Я использовал скрипт (хотя и модифицированный), найденный здесь .

Скрипт создания для моей таблицы:

USE [RedFridayDates];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
CREATE TABLE [tblRedFridayAllDates] (
[DATE_ID] int NOT NULL,
[DATE] datetime NOT NULL,
[YEAR] smallint NOT NULL,
[MONTH] tinyint NOT NULL,
[DAY_OF_WEEK] tinyint NOT NULL,
[REDFRIDAY] bit NULL,
[Period] tinyint NULL,
[ForecastSales] money NULL)
ON [PRIMARY];
GO

Период - это мой 4-4-5 "месяц".

Обычно я связываю свои запросы с этим с помощью следующего шаблона, который я создал:

SELECT RED.[YEAR] as [Year],
RED.PERIOD as [RF Period],

FROM TableName
  INNER JOIN REDFRIDAYDATES..TBLREDFRIDAYALLDATES RED
          ON RED.date =
             CAST (FLOOR (CAST (TableName.Date AS FLOAT)) AS DATETIME)

Большую часть моей базы данных использует SQL 2000, поэтому все мои даты - это поля даты и времени.

Есть ли более эффективный способ сделать это? Это лучший шаблон запроса, который я мог использовать? А как насчет других способов конвертировать дату в дату? Есть ли более быстрые способы сделать это?

1 Ответ

3 голосов
/ 27 августа 2009

Я использовал извлечение части даты datetime в постоянное вычисляемое поле (возможно, проиндексированное) и выполняю все объединения и поиски в вычисляемом поле (только дата). По сути, у вас будет новый 2k8 DATE тип до 2k8 за счет 8 байт (или даже 4 байт, если вы хотите сохранить его как int). Преимущества - SARGability datetime только частью даты.

...