Вставьте текущую дату и время в столбец и оставьте его постоянным - PullRequest
0 голосов
/ 14 декабря 2018

Я использую sql server в создании моего проекта с javafx.Их у меня есть таблица покупки и продажи.Одним из столбцов обоих является дата с текущей датой и временем, чтобы сохранить их как запись о том, что эта транзакция была сохранена за это время.Теперь я использую этот столбец даты с типом данных 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 голосов
/ 14 декабря 2018

Спасибо всем вам.Но я решил свою проблему, поместив столбец даты этой таблицы в тип данных datetime, и в моем запросе я ввел дату, используя метод getdate ().Это помогло мне сохранить текущую дату и время в моей таблице покупок и продаж.

0 голосов
/ 14 декабря 2018

Проблема в том, что ваш столбец 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 Вычислить столбец «Дата» в таблице «Продукт» невозможно, поскольку столбец недетерминирован.

У вас есть несколько других вариантовза это.Пожалуйста, используйте DATE или DATETIME столбцы для хранения и обработки дат и избегайте использования 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
    
...