Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在的列中插入当前日期时间,并保持不变_Sql_Sql Server_Nested Queries - Fatal编程技术网

Sql 在的列中插入当前日期时间,并保持不变

Sql 在的列中插入当前日期时间,并保持不变,sql,sql-server,nested-queries,Sql,Sql Server,Nested Queries,我正在使用SQLServer使用javafx制作我的项目。我有一张买卖表。这两个字段的其中一列都是date,它具有当前日期和时间,用于将它们存储为记录,表明此事务已在此时保存。 现在,我将该日期列与varchar数据类型一起使用,并将计算列规范与以下函数一起使用: (CONVERT([varchar](25),getdate(),(120))) 但当我使用查询从该表中选择记录时 SELECT pr.Date, p.Name, pr.Quantity, s.Name, p.Pur_Price F

我正在使用SQLServer使用javafx制作我的项目。我有一张买卖表。这两个字段的其中一列都是date,它具有当前日期和时间,用于将它们存储为记录,表明此事务已在此时保存。 现在,我将该日期列与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))
但它选择所有记录,将所有日期记录保留为当前日期和时间。提前谢谢。
期待您的回复。

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

修复方法是使用
持久化的
计算列,以便在插入或更新时实际存储表中的值:

CREATE TABLE Product (
    OtherColumns INT, 
    [Date] AS (CONVERT([varchar](25), getdate(), 120)) PERSISTED)
问题在于,非确定性表达式无法持久化,因为会弹出以下错误消息:

Msg 4936,16级,状态1,表中第1行计算列“日期” “产品”无法持久化,因为该列不确定

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

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

    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
    
  • 使用触发器设置值。这将覆盖原始操作设置的任何插入或更新的值(因为它将在操作后执行,如定义中所述)


    • 谢谢大家。但我解决了这个问题,将该表的date列放入datetime数据类型,然后在查询中使用getdate()方法输入日期。在我的购买和销售表中保存当前日期和时间对我来说很有效。

      此查询的目的是什么?请向我们显示您对相关表的DDL。以及DML如何在该表中插入行
      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