将当前日期时间插入到的列中并保持不变

时间:2018-12-14 06:47:47

标签: sql sql-server nested-queries

我在使用javafx创建项目时使用sql server。他们我有一张买卖表。这两个列中的一列是具有当前日期和时间的日期,以将它们存储为该事务在该时间已被保存的记录。 现在我正在使用具有varchar数据类型的那一日期列,并使用具有以下功能的计算列指定:

(CONVERT([varchar](25),getdate(),(120)))

但是当我使用查询从该表中选择记录时

SELECT pr.Date, p.Name, pr.Quantity, s.Name, p.Pur_Price
FROM (([Product] AS p
INNER JOIN [Purchase] AS pr ON pr.Product_id=p.Product_id)
INNER JOIN [Supplier] AS s ON s.Supplier_Id=p.Supplier_Id)
WHERE pr.Date>= dateadd(dd, 0, datediff(dd, 0, getdate()-30))

,但是它选择所有记录,使所有日期记录保持当前日期和时间。提前致谢。 期待您的良好答复。

2 个答案:

答案 0 :(得分:0)

问题是您的Date列是动态计算的,而不是实际存储在表中的。因此,每次您从该表中SELECT时,都会计算(CONVERT([varchar](25),getdate(),(120)))的计算列的表达式,因此所有行的值都相同。

一种修复方法是使用PERSISTED计算列,以便在插入或更新时将值与表一起实际存储:

CREATE TABLE Product (
    OtherColumns INT, 
    [Date] AS (CONVERT([varchar](25), getdate(), 120)) PERSISTED)

与此有关的问题是,不确定性表达式不能持久化,因为会弹出此错误消息:

  

信息4936,级别16,状态1,第1行,表中的“日期”计算列   因为该列是不确定的,所以无法保留“产品”。

您还有其他选择。请使用DATEDATETIME列存储和处理日期,并避免使用VARCHAR,因为这样做会带来很多问题。以下示例使用DATETIME

  • 使用DEFAULT约束链接到具有所需表达式的列:

    CREATE TABLE Product (
        OtherColumns INT, 
        [Date] DATETIME DEFAULT GETDATE())
    
    INSERT INTO Product (
        OtherColumns) -- Skip the Date column on the INSERT
    VALUES
        (1)
    
    SELECT * FROM Product
    
    OtherColumns    Date
    1               2018-12-14 08:49:08.347
    
    INSERT INTO Product (
        OtherColumns,
        Date)
    VALUES
        (2,
        DEFAULT) -- Or use the keyword DEFAULT to use the default value
    
    SELECT * FROM Product
    
    OtherColumns    Date
    1               2018-12-14 08:49:08.347
    2               2018-12-14 08:50:10.070
    
  • 使用触发器设置值。这将覆盖原始操作设置的任何插入或更新的值(因为它将在操作中 执行,如其定义中所述)。

    CREATE TRIGGER utrProductSetDate ON Product
        AFTER INSERT, UPDATE
    AS
    BEGIN
    
        SET NOCOUNT ON
    
        UPDATE P SET
            Date = GETDATE()
        FROM
            inserted AS I
            INNER JOIN Product AS P ON I.OtherColumns = P.OtherColumns -- Assuming PK or Unique columns join
    
    END
    

答案 1 :(得分:0)

谢谢大家。但是我通过将表的date列放入datetime数据类型来解决了我的问题,而我的查询已经使用getdate()方法输入了日期。它对我有用,可以将当前日期和时间保存在我的买卖表中。