选择日期为上半月和下半月的数据 (SQL)



当系统日期在每月的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因为我是一个势利小人,因为这就是我在将其集成到您的查询之前编写日代码的方式,并且因为我喜欢这种方法的一致性 - 因为它可以应用于检索任何日期时间部分,而MONTHDAYYEAR中具有对应项,但没有类似的函数可以检索,例如小时)

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

与其他解决方案基本相同,但更自我说话(在我看来......

最新更新