- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在人力资源管理部门工作。我的问题是在假期,如果员工从 19/3/2014
到 5/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 |
我在这里的工作是基于 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/
我正在寻找一种在Shamsi日历中找到假期的方法,我尝试了很多方法。 但最后得出的结论是我必须手动输入信息 我尝试的另一种方法是使用矩库(波斯语和贾拉利版 - ساعت ایران) 这是我的代码:
我是一名优秀的程序员,十分优秀!