【发布时间】:2021-04-05 23:42:47
【问题描述】:
这是示例
如何根据我的表中的日期名称获取此数据?
【问题讨论】:
-
您只能使用动态 SQL 执行此操作。就个人而言,这似乎是你应该修复你的设计。
标签: sql sql-server datetime unpivot lateral-join
这是示例
如何根据我的表中的日期名称获取此数据?
【问题讨论】:
标签: sql sql-server datetime unpivot lateral-join
你真的应该修正你的设计。每个医生/天元组应存储为单独的行,而不是列。
对于您当前的数据结构,我建议先取消透视,然后进行过滤:
select t.doctorname, v.*
from mytable t
cross apply (values
('Sunday', sunday)
('Monday', monday)
...
) v(dy, val)
where v.dy = datename(weekday, getdate())
【讨论】:
正如 Larnu & GMB 所说,您应该考虑修复您的设计。暂时还可以使用Dynamic SQL。
DECLARE @sqlCommand VARCHAR(max);
SET @sqlCommand = 'SELECT DOCTOR_NAME FROM MY_TABLE
WHERE ' + QUOTENAME(DATENAME(weekday, getdate())) + ' = 1';
EXEC (@sqlCommand)
【讨论】:
declare @t table
(
Doctor_Name varchar(20),
Sunday bit, Monday bit, Tuesday bit, Wednesday bit, Thursday bit, Friday bit, Saturday bit
);
insert into @t values
('dr.Sunday', 1, 0, 0, 0, 0, 0, 0),
('dr.Monday', 0, 1, 0, 0, 0, 0, 0),
('dr.Tuesday', 0, 0, 1, 0, 0, 0, 0),
('dr.Friday', 0, 0, 0, 0, 0, 1, 0),
('dr.Tuesday&Saturday', 0, 0, 1, 0, 0, 0, 1);
select *
from @t
where choose(datepart(weekday, dateadd(day, @@datefirst, getdate())), Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday) = 1;
【讨论】:
以下查询将帮助您获得结果:
DECLARE @SqlQuery varchar(8000)
DECLARE @DateVal DATE = GETDATE(), @DayName varchar(20)
SET @DayName = DATENAME(WEEKDAY, @DateVal);
SET @SqlQuery ='SELECT DOCTORNAME FROM TABLE_NAME WHERE '+ @DayName +'= 1'
EXEC(@SqlQuery)
【讨论】: