如何在SQL Where子句中组合datepart和literal?

时间:2016-05-13 17:12:10

标签: sql

我要做的是从日期字段中选择*,其中开始日期为9-1-去年,结束日期为8-31-当前年份,但我不想让年份具体化。

Select * from dbo."TABLE"
where (Date_Field) between  (year(DATEADD(year,-1, getdate())) +'09-01')  and ((YEAR( getdate())) +'08-31')

我收到“操作数类型冲突:日期与int不兼容”错误。

2 个答案:

答案 0 :(得分:1)

您的查询存在的问题是您尝试将整数和字符串组合在一起,然后您尝试将它们用作日期。在许多情况下,您需要明确CAST您的数据类型。此外,您在一年和其他日期之间错过了连字符。

WHERE <date_field> BETWEEN
    CAST(CAST(YEAR(GETDATE()) - 1 AS CHAR(4)) + '-09-01' AS DATETIME) AND
    CAST(CAST(YEAR(GETDATE()) AS CHAR(4)) + '-08-31' AS DATETIME)

通过使用日期函数和一些数学,您也可以在没有任何数据类型转换的情况下执行此操作:

BETWEEN
    DATEADD(DAY, 30, DATEADD(MONTH, 7, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0))) AND
    DATEADD(MONTH, 8, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()) - 1, 0))

答案 1 :(得分:0)

汤姆H做对了。 SQL服务器非常智能,可以从字符串中转换日期,所以

    $scope.value = vm.getValue();
    var element = $compile('<span my-custom-directive="value"></span>')($scope);        
    return element[0].outerHTML;

就足够了。更重要的是,你错过了SELECT * from dbo."TABLE" WHERE (Date_Field) BETWEEN CONVERT(varchar, YEAR(DATEADD(year, - 1, GETDATE()))) + '-09-01' AND CONVERT(varchar, YEAR(GETDATE())) + '-08-31' 中的领先-,而这可能是让你离开赛道的原因。