2011-06-02 57 views
1

如果销售日期已过期或尚未激活,但仅当assignDate为true,才想将saletype设置为0。我如何在视图中构建它?如果在Sql Server视图中声明

SELECT  dbo.ItemStore.SaleType, dbo.ItemStore.SpecialBuyFromDate AS SaleStartDate , 
dbo.ItemStore.SpecialBuyToDate AS SaleEndDate , dbo.ItemStore.AssignDate 
FROM   dbo.ItemMainAndStoreView 

回答

3

使用CASE表达

你需要允许时间方面GETDATE()因此我的DATEADD/DATEDIFF删除正确日期范围检查的时间组件。

对于SQL Server 2008+你可以使用CAST(GETDATE()的日期)

SELECT 
    CASE 
     WHEN DATEADD(day, 0, DATEDIFF(day, 0, GETDATE())) 
       BETWEEN dbo.ItemStore.SpecialBuyFromDate AND dbo.ItemStore.SpecialBuyToDate 
      THEN dbo.ItemStore.SaleType 
      ELSE 0 
    END AS SaleType 
    dbo.ItemStore.SpecialBuyFromDate AS SaleStartDate , 
    dbo.ItemStore.SpecialBuyToDate AS SaleEndDate, 
    CASE 
FROM  
    dbo.ItemMainAndStoreView 
+0

有趣的使用DATEADD(day,0,DATEDIFF(day,0,GETDATE()))来获取当天的开始 – lambacck 2011-06-02 18:53:02

+0

@lambacck:最有效的方法来做到这一点http://stackoverflow.com/questions/1177449/最好的方法去除的时间,部分的,日期时间,在-SQL服务器/ 1177529#1177529 – gbn 2011-06-02 18:55:07

1

利用Case..When将解决你的问题很容易

例如:

USE AdventureWorks2008R2; 
GO 
SELECT ProductNumber, Name, 'Price Range' = 
     CASE 
     WHEN ListPrice = 0 THEN 'Mfg item - not for resale' 
     WHEN ListPrice < 50 THEN 'Under $50' 
     WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250' 
     WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000' 
     ELSE 'Over $1000' 
     END 
FROM Production.Product 
ORDER BY ProductNumber ; 
GO 
+0

为什么不提供基于提供什么OP代码? – gbn 2011-06-02 18:50:48

+0

我认为他只需要方向...即要学习的东西,而不是现成的代码多数民众赞成在 – 2011-06-02 18:55:40

+0

两种方式都行。 – Ezi 2011-06-02 18:59:59

1
SELECT case 
    when getdate() between dbo.ItemStore.SpecialBuyFromDate 
     and dbo.ItemStore.SpecialBuyToDate 
    then dbo.ItemStore.SaleType 
    else 0 end as SaleType, 
    dbo.ItemStore.SpecialBuyFromDate AS SaleStartDate, 
    dbo.ItemStore.SpecialBuyToDate AS SaleEndDate 
FROM dbo.ItemMainAndStoreView 
+0

如果SpecialBuyToDate是今天00:00这失败,因为时间是20 :56 ...不是? – gbn 2011-06-02 18:56:59

+0

@gbn它取决于业务规则;有时结束日期的意思是在当天的00:00停止,有时在第二天的00:00停止,但这很好指出。 – RedFilter 2011-06-02 19:33:56