如何检索系统日期介于该月的第1天到第15天之间的日期在1月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
显示整个当月的数据。
谢谢!
答案 0 :(得分: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时,16-31中的任何数字都将产生值1.
(我也切换到DATEPART
因为我是一个势利小人,因为这是我在将日期代码集成到您的查询之前编写日期代码的方式,因为我喜欢这种一致性方法 - 因为它可以应用于检索任何日期时间部分,而MONTH
具有DAY
和YEAR
中的对应部分,但没有类似的函数可以检索例如小时)
答案 1 :(得分: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
基本上与其他解决方案相同,但更多的是自我说话(在我看来......)。