选择日期是月份的第一个和第二个月的数据(SQL)

时间:2013-11-15 09:54:46

标签: sql sql-server database sql-server-2008 date

如何检索系统日期介于该月的第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

显示整个当月的数据。

谢谢!

2 个答案:

答案 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具有DAYYEAR中的对应部分,但没有类似的函数可以检索例如小时)

答案 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

基本上与其他解决方案相同,但更多的是自我说话(在我看来......)。