2016-08-11 86 views
0

我在我的数据库中有一个列,它在我的联系人的不同星期几拥有一个字符串。如何根据星期几过滤数据库中的数据?

例如:联系人1周一和周三工作。

因此在Week_Day列中联系人1的字符串是“星期一,星期三”。我试图只显示一周当前工作日的行,代码如下。我尝试使用IN子句,但它不起作用,因为我没有设定要过滤的星期中的某一天。帮帮我!

string today = DateTime.Today.ToString("MM-dd-yy"); 

string day = DateTime.Today.DayOfWeek.ToString(); 
string find = "select convert(varchar(8), start, 10) AS start, convert(varchar(8), end_date, 10) AS end_date, ContactName, DepartmentName, Hours, Phone, Week_Day from Schedule join Contacts on Schedule.ContactId = Contacts.ContactId inner join Departments on Contacts.DepartmentId = Departments.DepartmentId where @Current BETWEEN start AND end_date AND Week_Day IN (@Day)"; 
SqlCommand comm = new SqlCommand(find, con); 
comm.Parameters.Add("@Current", SqlDbType.Date).Value = today; 
comm.Parameters.Add("@Day", SqlDbType.NVarChar).Value = day; 

con.Open(); 
comm.ExecuteNonQuery(); 
SqlDataAdapter da = new SqlDataAdapter(); 
da.SelectCommand = comm; 
DataSet ds = new DataSet(); 
da.Fill(ds); 
GridView3.DataSource = ds; 
GridView3.DataBind(); 

con.Close(); 
+2

如果可以的话,你会** **很多好这个存储为一个位字段,所以5是周一和周三(二进制101) ,你可以在第0位进行一次现场检查,找到所有在星期一工作的人,即'WHERE(WeekDay And 1)= 1' –

+1

实际上,使用一个单独的表来指派人员工作日会更好。这样,数据库服务器可以在执行查询时使用索引 – NineBerry

+0

[如何判断VARCHAR变量是否包含子字符串?](http://stackoverflow.com/questions/12265411/how-cani-i- tell-if-a-varchar-variable-contains-a-substring) – sr28

回答

2

那么你可以得到一周(名)当天,像这样:

string day = DateTime.Today.ToString("dddd"); 

然后你可以使用在你WHERE查询与LIKE。更改您的查询有:

WHERE Week_Day LIKE @day 

并添加参数有关@day包括%在起点和终点:

comm.Parameters.Add("@Day", SqlDbType.NVarChar).Value = "%" + day + "%"; 

More info on LIKE here


注:由于一些评论已经提到过最好不要将数据以这种方式存储在单个字符串列中,但我已根据您的问题回答了问题。

+0

这很好用!非常感谢! –

1
用DATENAME()和CHARINDEX()

也许

Where CHARINDEX(DateName(WEEKDAY,GetDate()),Week_Day)>0 and... 
+0

@musefan我同意,一切变化。 GetDate()很容易成为用户提供的日期(总是我的偏好)。 –

+0

^我的评论似乎已经消失,我没有删除它....奇怪 – musefan

相关问题