1

当系统日期在当月 1 日到 15 日之间以及系统日期在 16 日到月底之间时,如何检索日期在当月 1 日到 15 日之间的数据,它会自动检索每月 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

这显示了整个当月的数据。

谢谢!

4

2 回答 2

1

您可以依靠整数数学非常简单地计算出来:

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 MONTHDAYYEAR

于 2013-11-15T10:04:49.290 回答
0

Sybase 解决方案(对于其他 DBMS,请检查“datepart”函数等效项,在 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

与其他解决方案基本相同,但更自言自语(在我看来......)。

于 2013-11-15T10:10:18.537 回答