【问题标题】:Substituting Date values with CASE statement用 CASE 语句替换日期值
【发布时间】:2017-04-02 00:35:57
【问题描述】:

我有一组记录,其中包含一个 Date1 列和一个 Date2 列。如果记录的 Date1 值小于特定日期,则该值将替换为该记录的 Date2 列中的值。 日期列具有日期类型。我正在尝试使用 CASE 语句,但由于某种原因,我得到了所有记录的新值。

【问题讨论】:

  • 你想要一个 case 表达式,而不是 case 语句。
  • 这将有助于展示您对案例表达式的尝试,以便我们可以帮助解释您做错了什么。这可能就像错误地指定您的固定日期一样简单,例如依靠隐式转换;但显示示例数据(包含完整日期)也可能有用。
  • 我认为我的问题在于日期比较部分。比较日期的正确方法是什么?我的数据库是 Oracle。
  • @SoumyadeepPaul - Ronnis 的回答展示了如何比较日期。同样,如果您编辑您的问题以显示您尝试过的内容,我们可以帮助您找出为什么它没有按预期工作。请包括样本数据和预期结果;并说明任一日期列是否可以为空,如果是,会发生什么。

标签: sql oracle oracle11g oracle10g oracle-sqldeveloper


【解决方案1】:

空值呢?

select case when date1 < date '2016-01-01' then date2 else date1 end as your_date
  from your_table;

【讨论】:

    【解决方案2】:

    试试这样的;

    CASE
        WHEN Date1 < @DateVariable
            THEN Date2
        ELSE Date1
    END DateResult
    

    【讨论】:

    • @ 放在变量之前不是有效的 Oracle 语法。将: 用于绑定变量或&amp; 用于替换变量,或者,如果它是一个常量值,只需使用ANSI 日期文字。
    • 它只是一个占位符来展示它的外观
    【解决方案3】:

    假设您在变量中包含特定日期,例如:

    DELCARE particularDate DATE
    SET particularDate = '6/10/2016'
    

    你有你的桌子,比如:

    CREATE TABLE Tab(ID INT, Name NVARCHAR(100), Date1 DATE, Date2 DATE)
    INSERT INTO Tab VALUES(1, 'A', '10/10/2016', '11/10/2016')
    INSERT INTO Tab VALUES(2, 'B', '9/10/2016', '12/16/2016')
    INSERT INTO Tab VALUES(3, 'C', '1/10/2016', '11/10/2016')
    INSERT INTO Tab VALUES(4, 'D', '2/10/2016', '4/10/2016')
    INSERT INTO Tab VALUES(5, 'E', '4/10/2016', '2/10/2016')
    

    表格将如下所示:

    ID  Name      Date1       Date2
    1    A      2016-10-10  2016-11-10
    2    B      2016-09-10  2016-12-16
    3    C      2016-01-10  2016-11-10
    4    D      2016-02-10  2016-04-10
    5    E      2016-04-10  2016-02-10
    

    然后您可以使用以下查询:

    SELECT      t.ID,
                t.Name,
                CASE
                    WHEN (t.Date1 < particularDate)
                    THEN t.Date2
                    ELSE t.Date1
                END AS GreaterDate
    FROM        Tab t
    

    这会给你以下结果:

    ID  Name    GreaterDate
    1    A      2016-10-10
    2    B      2016-09-10
    3    C      2016-11-10
    4    D      2016-04-10
    5    E      2016-02-10
    

    如果您指定在Date1 和特定日期相等的情况下应该发生什么,这将很有用。 然后您可以显式定义此条件的结果。你可以这样做:

    SELECT      t.ID,
                t.Name,
                CASE
                    WHEN (t.Date1 < particularDate) THEN t.Date2
                    WHEN (t.Date1 > particularDate) THEN t.Date1
                    ELSE t.Date1          --when date1 and particularDate are equal
                END AS GreaterDate
    FROM        Tab t
    

    希望对你有帮助!!!

    【讨论】:

    • 在 Oracle 中将 @'s 放在变量名之前不起作用。
    • @Boneist 是的,你是对的!我的错,我在需要的 SQL Server Management Studio 上写了它。应该在粘贴之前将其删除。感谢您指出。已相应更新答案。
    • '10/10/2016' 是字符串文字而不是日期文字 - Oracle 将隐式尝试使用 NLS_DATE_FORMAT 会话参数将其转换为日期,但是,这是客户端设置,不能保证是静态的用户之间也不一致。如果要使用文字,请使用 ANSI 日期文字 DATE '2016-10-10'
    【解决方案4】:

    ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';

    选择 CASE WHEN DATE1

    【讨论】:

    • 除了使用to_date() 代替日期文字之外,这与罗尼斯几小时前所说的有何不同?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多