0

我目前正在制作一个计算机化的工资单系统,但对于我应该使用什么查询来检查员工在假期期间是否在场时遇到了问题。

我所做的是创建了这个查询:

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,因为即使我只需要月份来使用 C# 为 EmployeeHolidays 执行条件语句,我也必须插入年份。

我应该使用什么方法来解决这个问题?我应该只输入一个虚拟年份作为Holidays.holidayDate 的输入吗?我是否应该将 Holidays.holidayDate 设为 VARCHAR 并将其与当前年份一起解析为 DATE 数据类型?对于这种方法,我应该使用哪些查询?

4

5 回答 5

2

对于虚拟年份,您将遇到诸如不允许使用 2 月 29 日等问题,具体取决于所使用的虚拟年份,尽管如果是闰年,则当前年份可能存在 2 月 29 日。

我建议您将实际的完整假期日期与年份一起存储,如果您在计算中不使用年份,那是您的事,但为什么要存储其他值呢?

于 2013-08-15T04:26:18.883 回答
2

由于在大多数国家/地区,日期假期每年都在变化,由于周末,您应该使用完整日期格式的日期。

此外,我认为您应该存储非规范化Calendar表。

使用以下列:

  • 日期
  • 自给定开始日期以来的天数(例如 1-1-1900)

  • 给定开始日期的工作日数(例如 1-1-1900)

  • 一年中的一周
  • 月 月
  • 白天部分
  • 星期几
  • 四分之一 #
  • 每月第一天
  • 本季度的第一天
  • 是周末
  • 是假期(+描述)

一旦填写了这样的表格,您将轻松地进行具有最佳性能的日期数学运算。喂食这种桌子的样品在这里

请注意,如果您需要支持多个国家/地区,您可能需要添加一CountryCode列来保存每个国家/地区的日历。

于 2013-08-15T05:36:25.757 回答
1

您可以将假期的日期和月份存储为 int 类型的单独字段。然后在查询时可以使用月和日函数。

于 2013-08-15T04:24:48.433 回答
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 
于 2013-08-15T04:29:38.967 回答
0

因此,我将使用DATE带有CHECK约束的列:

CREATE TABLE Holidays
(
    ...
    HolidayDate DATE NOT NULL,
    CONSTRAINT CK_Holidays_VerifyYearOfHolidayDate CHECK( YEAR(HolidayDate)=1 )
);

原因:

  • 你得到MONTHDAY验证。否则,如果我要使用SMALLINT四位数的列(例如 MMDD,MM= 两位数表示月份,DD=两位数表示日)。此外,我将不得不添加另一个约束来验证 MM (1<= MM <=12)、DD (1<= DD <= 31) 并验证 MM 和 DD 之间的相关性(例如,1 月有 31 天,但 2 月有 28/29 天等)
  • 我可以使用日期函数DAYMONTHDATEPART等。如果我要使用SMALLINT列,那么我将使用 / 和 % 运算符来获取月份和日期(例如 1231 / 100 = 12 和 1231 % 100 = 31)。

我会定义一个函数,它需要一年和 aHolidayDate作为参数并返回全年:

CREATE FUNCTION dbo.HolidayDateWithYear(@YYYY SMALLINT, @HolidayDate DATE)
RETURNS DATE
WITH SCHEMABINDING    
AS
BEGIN
RETURN DATEADD(YEAR,@YYYY,@HolidayDate);
END;
于 2013-08-15T07:41:01.947 回答