在SQL

时间:2017-05-07 03:40:35

标签: sql sql-server-2014

我正在寻找21月至4月20日的出生日期,这一年并不重要。而且当我搜索其他月份和日期时,它似乎正在出现。

select * from AllStudentInfo Where 
((MONTH(birthDate) >= 3 and day(birthDate) >= 21)
OR
(MONTH(birthDate) <= 4 and day(birthDate) <= 20))
AND
(BGRStatus = 'S' OR BGRStatus = 'SL')

2 个答案:

答案 0 :(得分:1)

你有可能想要发现和发现即将来临无论如何,您可以按如下方式创建虚拟日期:

SELECT DATEFROMPARTS (2017,month(birthDate),day(birthDate) as birthday
FROM AllStudentInfo

在这种情况下,您可以使用:

SELECT *
FROM AllStudentInfo
WHERE DATEFROMPARTS (2017,month(birthDate),day(birthDate)
    BETWEEN '2017-03-21' AND '2017-04-20';

2017年是任意的。关键是BETWEEN子句中的日期是在同一年。

使用更现代的技术,您可以按如下方式组合:

WITH cte AS(
    SELECT *,DATEFROMPARTS (2017,month(birthDate),day(birthDate) as birthDay
    FROM AllStudentInfo
)
SELECT * FROM cte WHERE birthDay BETWEEN '2017-03-21' AND '2017-04-20';

cte公用表格表达式,它是使用子查询的替代方法。

这是一个更接近问题精神的替代方案。您可以使用format函数生成一个纯粹是月份和月份的表达式。天:

format(birthDate,'MM-dd')

MM是MSSQL表示2位数月份数的方式,而dd是该月份的2位数日。

这样你可以使用:

format(birthDate,'MM-dd') BETWEEN '03-21' AND '04-20'

再次作为CTE:

WITH cte AS(
    SELECT *,format(birthDate,'MM-dd') as birthDay
    FROM AllStudentInfo
)
SELECT * FROM cte WHERE birthDay BETWEEN '03-21' AND '04-20';

你应该得到相同的结果,但完全忽略了这一年。

答案 1 :(得分:0)

将您的陈述切换为package main import ( "customlogger" "fmt" "net/http" ) func main() { logger := customlogger.GetInstance() logger.Println("Starting") http.HandleFunc("/", sroot) http.ListenAndServe(":8080", nil) } func sroot(w http.ResponseWriter, r *http.Request) { logger := customlogger.GetInstance() fmt.Fprintf(w, "welcome") logger.Println("Starting") }

喜欢这样

AND

使用select * from AllStudentInfo Where ((MONTH(birthDate) >= 3 and day(birthDate) >= 21) AND --Make the change here (MONTH(birthDate) <= 4 and day(birthDate) <= 20)) AND (BGRStatus = 'S' OR BGRStatus = 'SL') 您正在查询该日期范围或该月份范围内的任何内容。因此,你会得到其他每个月的结果。