尝试在SQL SELECT语句中使用DATETIME

时间:2018-04-25 12:23:37

标签: sql-server

我正在尝试使用SQL中的DATETIME从另一个表中获取信息。我一直试图弄清楚爆破的FUNCTION如何工作,它的语法现在是2个小时。所以你可以说我的语言或语法不是很多或很流畅。

请你帮我发现我的错误并纠正我,非常感谢。这是代码:

CREATE FUNCTION dbo.PetFunction (@PETVAT int)
    RETURNS INT
    AS
    BEGIN

    DECLARE @VATID int
    SET @VATID = 0
    SELECT @VATID = [ID](*Invalid column name 'ID'*.) 
      FROM dbo.VAT(*Invalid object name*.) 
    WHERE VATBeginDate(*Invalid Column name*.) > DATETIME(*Invalid column name*.) 
    AND VATEndDate(*Invalid column name*.) < DATETIME(*Invalid column name*.) =(*Incorrect syntax newr '='*) @PETVAT

    RETURN @VATID
    END

我在抛出这些错误的单词旁边标记了错误消息,并在Italic中标记了它。我只有2个表是dbo.PETS和dbo.VAT。

PETS专栏:

PetType, Stock, Sold, VATID, SoldPrice, 
PurchaseDateSupplier, SoldDateClient and SalesPerson.

增值税栏:

VATBeginDate VATEnddate and VAT

所以这里有每个表格中的每一个都有一行数据:

dbo.PETS:

+----+---------+-------+-------+-------+-----------+----------------------+----------------+-------------+
| ID | PetType | Stock | Sold  | VATID | SoldPrice | PurchaseDateSupplier | SoldDateClient | SalerPerson |
+----+---------+-------+-------+-------+-----------+----------------------+----------------+-------------+
|  2 | Cat     |     3 |     2 |     1 |   1500.00 | 2018-02-04           | 2018-02-07     | Sammy       |
+----+---------+-------+-------+-------+-----------+----------------------+----------------+-------------+

dbo.VAT:

+----+--------------+------------+------+
| ID | VATBeginDate | VATEnddate | VAT  |
+----+--------------+------------+------+
|  1 | 2017-01-01   | 2018-01-01 | 0.14 |
+----+--------------+------------+------+

我正在尝试将dbo.VAT中的ID列值插入dbo.PETS中的VATID单元格中,因此如果当前日期大于2018-01-01,则应输入ID 2这将是dbo.VAT表中增值税增加到0.15的新行(由于最近南非的增值税变化,我希望它能够动态地“未来证明”此功能,如果它再次变化您所做的就是将新的增值税插入dbo.VAT表中,其余的则自动完成,而售出的旧宠物仍然以正确的增值税价格记录在售。

这只是一个小项目,我正在帮助自学一些SQL。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我会对你的要求做一些快速的假设。

  1. 我认为您列出的每张桌子实际上都有一个名为ID的主键(这就是您试图从增值税中提取的内容)
  2. 我假设你试图根据PETS的SoldDateClient从VAT中提取正确的VATID
  3. 如果这是真的,那么我就像这样改变你的功能:

     DECLARE @ID INT, @Dt DATETIME
     SELECT @Dt=SoldDateClient FROM Pets WHERE ID=@PETID
     SELECT @ID=ID
        FROM VAT
        WHERE VATBeginDate >= @Dt 
           AND VATEndDate <= @Dt
     RETURN @ID
    

    仅供参考 - 如果目标是使用此函数填充PETS中的VATID列,那么您可以跳过使用函数,只需使用更新语句。

    UPDATE PETS 
       SET VATID=V.ID
       FROM PETS P
          INNER JOIN VAT V ON P.SoldDateClient>=V.VATBeginDate 
             AND P.SoldDateClient<V.VatEndDate
       WHERE P.ID=1234
    

    但请注意,VAT表中的任何重叠日期都会导致您遇到问题。因此 - 如果您决定尝试,请确保每增值税日期范围内只有1条记录。

    当然 - 任何有疯狂SQL技能的人都会进入并编辑该更新声明以记录多个记录......并且将我的初始答案(取决于他们当时的心情)进行下调。

答案 1 :(得分:0)

抱歉擅离职守。我从来没有弄清楚如何让它工作,所以我放弃了这个并转移到另一个练习项目。我应该会见一个会亲自向我解释这些事情的人,并在不久的将来证明这一点,谢谢大家的帮助和建议,再次抱歉消失。

亲切的问候。