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、 哈维