当系统日期在每月的1号到15号之间时,如何检索日期在每月1号到15日之间的数据,当系统日期在16日和月底之间时,它将自动检索每月16号和30日/31日之间的数据?
请帮助我。
我有这个代码。
SELECT
CONVERT(VARCHAR(11), DATEADD(DAY, DATEDIFF(DAY, 0, DateTimeIn), 0)) AS [Date],
CONVERT(TIME(0),DateTimeIn) AS [Time In], CONVERT(TIME(0),DateTimeOut) AS [Time Out],
Late, Undertime, AWOL, Leave
FROM
tblAttendance2
WHERE
UserID = (SELECT UserID FROM tblUsers WHERE Username = @Username)
AND MONTH(DateTimeIn) = MONTH(GetDate())
ORDER BY
CONVERT(DATE, DateTimeIn, 101) ASC
这显示了整个当月的数据。
谢谢!
您可以依靠整数数学来非常简单地计算它:
WHERE
UserID = (SELECT UserID FROM tblUsers WHERE Username = @Username)
AND DATEPART(month,DateTimeIn) = DATEPART(month,GetDate())
AND DATEPART(day,DateTimeIn)/16 = DATEPART(day,GetDate())/16
基本上,0-15 之间的任何数字除以 16 将产生值 0。16-31 之间的任何数字除以 16 将产生值 1。
(我也切换到DATEPART
因为我是一个势利小人,因为这就是我在将其集成到您的查询之前编写日代码的方式,并且因为我喜欢这种方法的一致性 - 因为它可以应用于检索任何日期时间部分,而MONTH
在DAY
和YEAR
中具有对应项,但没有类似的函数可以检索,例如小时)
Sybase 解决方案(对于其他 DBMS,请检查 "datepart" 函数 equivalend,在 MSSQL 中应该是相同的。
SELECT
CONVERT(VARCHAR(11), DATEADD(DAY, DATEDIFF(DAY, 0, DateTimeIn), 0)) AS [Date],
CONVERT(TIME(0),DateTimeIn) AS [Time In], CONVERT(TIME(0),DateTimeOut) AS [Time Out],
Late, Undertime, AWOL, Leave
FROM
tblAttendance2
WHERE
UserID = (SELECT UserID FROM tblUsers WHERE Username = @Username)
AND MONTH(DateTimeIn) = MONTH(GetDate())
AND
(
(datepart(day, GetDate() <= 15 AND datepart(day, DateTimeIn) <= 15)
OR
(datepart(day, GetDate() > 15 AND datepart(day, DateTimeIn) > 15)
)
ORDER BY
CONVERT(DATE, DateTimeIn, 101) ASC
与其他解决方案基本相同,但更自我说话(在我看来......