如何仅匹配SQL Server中datetime列的月份和年份部分

时间:2015-09-21 09:45:11

标签: sql asp.net sql-server

我有两个输入,月份和年份。

  selectedMonth = DDLMonth.SelectedItem.Value;//1
  SelectedYear = DDLYear.SelectedItem.Text.Trim();//2013

我想显示特定月份和年份的预设记录,而不是仅显示日期。我想要显示注册员工

sql查询

select e.EnquiryId, RegistrationNumber, Name
from Branch as b
    left join Enq as e on b.Enqui = e.Enqu
where Reg = @RegNo
  and Pay=Cheque 

我需要选择月份= 1年份​​= 2015年。如果这个在付款日期和检查。类似的东西:

where Registratio = @RegNo
  and Payment(month) = selectedMonth
  and payment(year) = selectedyear
  and chequere(month) = selected Month
  and chequere(year) = selected year

我的列号格式和付款日期采用日期时间格式。

2 个答案:

答案 0 :(得分:3)

执行此操作的最有效方法是在应用程序代码中构建日期:

selectedMonth = DDLMonth.SelectedItem.Value;//1
SelectedYear = DDLYear.SelectedItem.Text.Trim();//2013  

var date = new DateTime(int.Parse(SelectedYear), int.Parse(selectedMonth), 1);

然后将此日期作为参数传递给您的查询:

where RegistrationNumber = @RegNo
  and PaymentDate >= @Date
  and paymentdate < DATEADD(MONTH, 1, @Date)
  and chequereceiveddate >= @Date
  and chequerecieveddate < DATEADD(MONTH, 1, @Date);

这使您的查询sargable,并且意味着您无需在列上执行DATEPART()功能。

答案 1 :(得分:0)

GarethD提供了最佳解决方案,但另一种方法是使用DATEPART。

示例:

where RegistrationNumber = @RegNo
and DATEPART(month, PaymentDate) = selectedMonth
and DATEPART(year, PaymentDate) = selectedYear
and DATEPART(month, chequerecieveddate) = selectedMonth
and DATEPART(year, chequerecieveddate) = selectedYear

这只是举一个DATEPART()的例子,如果您想在某些月份找到平均付款,那么这将更有用。