gpt4 book ai didi

c# - 每个月有两个日期的日子

转载 作者:太空宇宙 更新时间:2023-11-03 18:27:45 24 4
gpt4 key购买 nike

我在人力资源管理部门工作。我的问题是在假期,如果员工从 19/3/20145/4/2014 休假,应用程序计算他一个月休假 18 天而不是 3 天。

我将假期存储在 vacation 表中

列:

emp_id | vac_type | from | to

现在,我如何进行查询以告诉我他在 3 月休假 13 天,在 4 月休假 5 天?

最佳答案

好问题!我能够找到一种方法来做到这一点,但我不得不对日期使用略有不同的符号(见下文)。

DECLARE @startDate DATETIME, @endDate DATETIME, @lastDayOfStartMonth INT

SET @startDate = '3/19/2014'
SET @endDate = '4/5/2014'

SELECT @lastDayOfStartMonth =
1+DATEPART(dd, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@startDate)+1,0)))

SELECT DATENAME(month, @startDate) AS [Month],
@lastDayOfStartMonth - DATEPART(dd, @startDate) AS [DaysSpent],
DATENAME(month, @endDate) AS [Month],
DATEPART(dd, @endDate) AS [DaysSpent]

输出:

| Month | DaysSpent | Month | DaysSpent |
|-------|-----------|-------|-----------|
| March | 13 | April | 5 |

SQL Fiddle example

我在这里的工作是基于 Pinal Dave 的帖子 SQL SERVER – Find Last Day of Any Month – Current Previous Next 中的设计


处理超过两个月的日期

DECLARE @startDate DATETIME, @endDate DATETIME, @currentDate DATETIME, @currentDay INT
DECLARE @currentMonth INT, @lastDayOfStartMonth INT
CREATE TABLE #VacationDays ([Month] VARCHAR(10), [DaysSpent] INT)

SET @startDate = '1/19/2014'
SET @endDate = '4/5/2014'
SET @currentMonth = DATEPART(mm, @startDate)
SET @currentDay = DATEPART(dd, @startDate)
SET @currentDate = @startDate

WHILE @currentMonth < DATEPART(mm, @endDate)
BEGIN
SELECT @lastDayOfStartMonth =
DATEPART(dd, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@currentDate)+1,0)))
PRINT @lastDayOfStartMonth
INSERT INTO #VacationDays
SELECT DATENAME(month, @currentDate) AS [Month],
@lastDayOfStartMonth - @currentDay + 1 AS [DaysSpent]

SET @currentDate = DATEADD(mm, 1, @currentDate)
SET @currentMonth = @currentMonth + 1
SET @currentDay = 1
END

IF DATEPART(mm, @startDate) = DATEPART(mm, @endDate)
BEGIN
INSERT INTO #VacationDays
SELECT DATENAME(month, @endDate) AS [Month],
DATEPART(dd, @endDate) - DATEPART(dd, @startDate) + 1 AS [DaysSpent]
END
ELSE
BEGIN
INSERT INTO #VacationDays
SELECT DATENAME(month, @endDate) AS [Month],
DATEPART(dd, @endDate) AS [DaysSpent]
END

SELECT * FROM #VacationDays
DROP TABLE #VacationDays

输出:

|    Month | DaysSpent |
|----------|-----------|
| January | 13 |
| February | 28 |
| March | 31 |
| April | 5 |

SQL Fiddle example - 运行大约需要一分钟。它在 SSMS 的本地实例中运行速度要快得多。


这是它的工作原理

在下面的示例中,我使用的@startDate 值为05-05-2015 .

CAST(0 AS DATETIME) 的值是日期1900-01-01 ,所以这意味着行 DATEDIFF(m,0,@startDate)本质上是在问,自 1900 年 1 月 1 日以来已经过去了多少个月?对于此示例,该值为 1384 .

DATEADD(mm, DATEDIFF(m,0,@startDate)+1,0)DATEADD(mm, 1384+1,0)意思是,将 1385 个月添加到日期值 0(或 1900-01-01)。这将为我们提供@startDate之后的第一个月的 DATETIME 值月。对于我们的示例,2015-06-01 .

DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@startDate)+1,0))DATEADD(s,-1,'2015-06-01')从下个月的第一天减去 1 秒,给我们当月的最后一秒,或 2015-05-31 23:59:59 .

然后我们使用DATEPART获取该日期的日值:31 .

31 是五月的最后一天。

关于c# - 每个月有两个日期的日子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30044295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com