我目前正在制作一个计算机化的工资单系统,我遇到的问题是我应该使用什么查询来检查员工是否在假日期间在场。
我做的是创建了这个查询:
CREATE TABLE Holidays
(
id INT PRIMARY KEY IDENTITY,
holidayName VARCHAR(55),
holidayDate DATE <---- This is my problem
);
CREATE TABLE EmployeeHolidays
(
id INT PRIMARY KEY IDENTITY,
employeeId INT FOREIGN KEY REFERENCES Employees(id),
holidayId INT FOREIGN KEY REFERENCES Holidays(id),
workingDate DATE,
employeeTimeIn TIME,
employeeTimeOut TIME
);
现在问题在于在Holidays.holidayDate中插入DATE,因为我必须插入Year,即使我只需要月份来使用C#为EmployeeHolidays做一个条件语句。
我应该采用什么方法解决这个问题?我应该把假年作为Holidays.holidayDate的输入吗?我应该将Holidays.holidayDate设为VARCHAR并将其解析为DATE数据类型以及当前年份吗?我应该用什么查询来实现这种方法?
答案 0 :(得分:2)
如果是虚拟年份,你会遇到诸如2月29日不允许的问题,这取决于所使用的虚拟年份,尽管如果是闰年,本年度可能存在2月29日。
我建议您将实际的完整假期日期与年份存储在一起,如果您在计算中没有使用年份那么这是您的业务,但为什么要存储其他一些价值呢?
答案 1 :(得分:2)
由于在大多数国家/地区,日期假期每年都会发生变化,因为周末您应该使用完整日期格式的日期。
更进一步,我认为你应该存储非规范化Calendar
表。
使用以下列:
一旦填写了这样的表格,您就可以轻松地以最佳性能进行日期数学运算。喂养这样一张桌子的样本是here
请注意,如果您需要支持多个国家/地区,则可能需要添加CountryCode
列来保存每个国家/地区的日历。
答案 2 :(得分:1)
您可以将假日的日期和月份存储为int类型的单独字段。然后在查询时可以使用月和日功能。
答案 3 :(得分:0)
对于创建日期使用功能:
CREATE FUNCTION dbo.MyDate(@M INT, @D INT)
RETURNS DATE
AS
BEGIN
RETURN DATEADD(MONTH, @M - 1, (DATEADD(DAY, @D - 1, 0)))
END
SELECT dbo.MyDate(2, 10)
或当年:
CREATE FUNCTION dbo.MyDate(@M INT, @D INT)
RETURNS DATE
AS
BEGIN
RETURN DATEADD(YEAR, YEAR(GETDATE()) - 1900, DATEADD(MONTH, @M - 1, (DATEADD(DAY, @D - 1, 0))))
END
答案 4 :(得分:0)
我会使用带有DATE
约束的CHECK
列:
CREATE TABLE Holidays
(
...
HolidayDate DATE NOT NULL,
CONSTRAINT CK_Holidays_VerifyYearOfHolidayDate CHECK( YEAR(HolidayDate)=1 )
);
原因:
MONTH
和DAY
验证。否则,如果我使用带有四位数的SMALLINT
列(例如MMDD,MM =月份两位数,DD =一天两位数)。此外,我将不得不添加另一个约束来验证MM(1 <= MM <= 12),DD(1 <= DD <= 31)并验证MM和DD之间的相关性(例如,1月有31天)但是二月有28/29天等。)DAY
,MONTH
,DATEPART
等。如果我要使用SMALLINT
列,那么我会使用/和%运算符得到月和日(例如1231/100 = 12和1231%100 = 31)。我会定义一个函数,该函数需要一年且HolidayDate
作为参数并返回全年:
CREATE FUNCTION dbo.HolidayDateWithYear(@YYYY SMALLINT, @HolidayDate DATE)
RETURNS DATE
WITH SCHEMABINDING
AS
BEGIN
RETURN DATEADD(YEAR,@YYYY,@HolidayDate);
END;