C# 仅插入月份和日期

C# 仅插入月份和日期,c#,sql,sql-server,tsql,sql-insert,C#,Sql,Sql Server,Tsql,Sql Insert,我目前正在制作一个计算机化的工资系统,我有一个问题,我应该使用什么查询来检查员工是否在度假期间在场 我所做的是创建了这个查询: CREATE TABLE Holidays ( id INT PRIMARY KEY IDENTITY, holidayName VARCHAR(55), holidayDate DATE <---- This is my problem ); CREATE TABLE EmployeeHolidays ( id I

我目前正在制作一个计算机化的工资系统,我有一个问题,我应该使用什么查询来检查员工是否在度假期间在场

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

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
);
创建表假日
(
id INT主键标识,
holidayName VARCHAR(55岁),

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

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

对于虚拟年份,您将遇到诸如2月29日之类的问题根据使用的虚拟年份,不允许使用,但如果是闰年,则当前年份中可能存在2月29日


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

对于虚拟年份,您将遇到一些问题,例如,根据所使用的虚拟年份,不允许使用2月29日,尽管如果这是闰年


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

对于创建日期使用功能:

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 

对于创建日期使用函数:

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 

因为在大多数国家,日期假日每年都在变化,由于周末的原因,你应该有完整的日期格式

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

包含以下列:

  • 日期
  • 自给定开始日期起的天数(如1-1-1900)
  • 给定开始日期的工作日数(如1-1-1900)
  • 一年中的一周
  • 日间部分
  • 星期五
  • 四分之一#
  • 月初一
  • 季度第一天
  • 是周末吗
  • 是假日(+说明)
一旦你填写了这样一个表格,你就可以轻松地进行具有最佳性能的日期数学运算


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

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

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

包含以下列:

  • 日期
  • 自给定开始日期起的天数(如1-1-1900)
  • 给定开始日期的工作日数(如1-1-1900)
  • 一年中的一周
  • 日间部分
  • 星期五
  • 四分之一#
  • 月初一
  • 季度第一天
  • 是周末吗
  • 是假日(+说明)
一旦你填写了这样一个表格,你就可以轻松地进行具有最佳性能的日期数学运算


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

我将使用带有
复选框的
日期
列,因此:

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


  • 您将得到
    MONTH
    DAY
    验证。否则,如果我使用一个带有四位数字的
    SMALLINT
    列(例如,MMDD,MM=两位数字表示月份,DD=两位数字表示天)。此外,我还必须添加另一个约束来验证MM(1我将使用带有
    检查约束的
    日期
    列,因此:

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


    • 您将得到
      MONTH
      DAY
      验证。否则,如果我使用一个带有四位数字的
      SMALLINT
      列(例如,MMDD,MM=两位数字表示月份,DD=两位数字表示天)。此外,我还必须添加另一个约束来验证MM(1我很好奇为什么
      holidayDate
      不应该包含年份部分。你可以创建一个函数
      IsHoliday
      并删除假期表。我发现最难的部分是计算复活节。或者这可能是一个更大的日历表的一部分,该日历表包含
      IsHoliday
      IsWeekEnd
      等等,这将对于这种类型的应用程序似乎很有用长时间的假期--总统节、斋月、感恩节--每年都会更改日期。使用静态“模型假期”可能不是最好的方法。在类似的情况下,我创建了一个存储过程,该过程将生成给定年份的假期(如果表中不存在),然后我会将日期与日期进行匹配。这很好。这是一种更有效的使用方式,因为您可以使用直接SQL连接逻辑来检查一天是否为假日。FWIW,我遇到了完全相同的问题,并最终创建了一个日历表,其中包括一个带有原因字段的WorkingDay标志。我个人允许工资单管理假期,但真的没有那么多(我的公司在美国,只在最普通的假期休假)这需要自动化。事实证明,它非常方便,并且简化了我几乎所有的报告。当使用这些类型的系统时,您经常会发现自己围绕日历生成报告。我很好奇为什么
      holidayDate
      不应该包含年份部分。您可以创建一个函数
      IsHol我发现最难的部分是计算复活节。或者这可能是一个更大的日历表的一部分,它有一个
      IsHoliday
      IsWeekEnd
      等,这似乎对这种类型的应用很有用。假期的最后一天--总统节,斋月,感恩节--每年都会更改日期r、 哈维