标签: datetime

Sybase 如何存储日期时间信息?

我们有一个 Sybase 数据库,当前在某些表中存储日期时间值。如果我们将装有 Sybase 数据库的服务器移动到位于另一个时区的另一个国家/地区,数据库中的日期时间值是否会以不同的方式表示?

换句话说,请考虑以下场景:

Sybase 数据库在时区 +2:00 运行。

从我位于时区 +1:00 的 Java 应用程序中,它将 1970 年 1 月 1 日 1:00 写入数据库,这是应用程序时区中的纪元 0。

preparedStatement.setTimestamp(3, new Timestamp(0));
Run Code Online (Sandbox Code Playgroud)

但是,当我使用 SQL Workbench/J 客户端(时区 +1:00)查询数据库时,我看到

1970-01-01 01:00:00
Run Code Online (Sandbox Code Playgroud)

在我的桌子上。事实上,无论我将计算机时钟更改为哪个时区,SQL Workbench/J 客户端始终1970-01-01 01:00:00从数据库中读取数据。

位于时区 +3:00 的另一个 Java 客户端读取的值与

1970-01-01 01:00:00
Run Code Online (Sandbox Code Playgroud)

翻译为纪元-7200000-2:00客户的时区!

那么回到我原来的问题,Sybase 是否将日期时间值存储为字符串或纪元?我没有可以进行实验的免费 Sybase 服务器,那么当我们将服务器移动到另一个时区不同的国家/地区时,我们会发生什么情况呢?

我们使用的类型是“datetime”,例如:

CREATE TABLE "dbo"."whatever" (eventDate datetime NOT NULL);
Run Code Online (Sandbox Code Playgroud)

sybase jdbc java timezone datetime

4
推荐指数
1
解决办法
5455
查看次数

日期时间仅作为日期

我知道 SQL Server 2005 不支持DATE,因此不可能将日期时间转换为日期。

我想要做的是在当前一周的一整天内列出所有具有日期时间的记录。

所以我需要在本周星期一创建的所有记录忽略时间戳。目前我正在使用以下内容,它确实显示了本周的周一至周五,但包括时间戳,这意味着我将根据查询的运行时间看到不同的输出:

set datefirst 1

select 
    DATEADD(day, 1 - DATEPART(dw, GETDATE()), CONVERT( DATETIME, GETDATE())) as Monday,
    DATEADD(day, 2 - DATEPART(dw, GETDATE()), CONVERT( DATETIME, GETDATE())) as Tuesday,
    DATEADD(day, 3 - DATEPART(dw, GETDATE()), CONVERT( DATETIME, GETDATE())) as wednesday,
    DATEADD(day, 4 - DATEPART(dw, GETDATE()), CONVERT( DATETIME, GETDATE())) as Thursday,
    DATEADD(day, 5 - DATEPART(dw, GETDATE()), CONVERT( DATETIME, GETDATE())) as Friday
Run Code Online (Sandbox Code Playgroud)

任何人都可以提供帮助吗?

我的预期输出将是本周每一天的一列,每周从星期一开始(即:Datefirst 1)。最终,我将在 case 语句中使用它,例如:

CASE
WHEN DateColumn >= DATEADD(day, 1 - DATEPART(dw, GETDATE()), CONVERT( DATETIME, GETDATE())) …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 datetime

4
推荐指数
1
解决办法
1645
查看次数

UPDATE 语句中 GETDATE() 值出现差异的可能性

正如标题所暗示的那样,我想知道这是否可能,或者您是否遇到过同一 UPDATE 语句中不同 GETDATE() 结果的问题。

我有一个存储过程,它更新包含两个 DateTime 列的记录,其中还有一个 CASE 语句,一般更新如下:

 UPDATE A
        SET Status = dbo.func('P')
           ,Time1 = GETDATE()
           ,Time2 = ISNULL(A.Time2, GETDATE())
           ,ModifiedOn = GETDATE()
        FROM dbo.Table A
        WHERE A.ID = @ID
        AND A.RowID = @RowID;
Run Code Online (Sandbox Code Playgroud)

我看到 Time2 值稍晚一些,但总是以 3 或 4 的增量增加。这似乎是由于 SQL Server 通过设计将日期时间四舍五入到最接近的 0.000、0.003、0.007 Stack Post Here

我认为这种差异是由两个 GETDATE() 调用之间的轻微延迟引起的,并且延迟通常会导致一个“滴答声”,因为我只看到 Time2 - Time1 = {-.003, -.004 之间的差异}。

上述查询是否有可能返回两个不同的 GETDATE() 结果?

sql-server datetime sql-server-2019

4
推荐指数
1
解决办法
389
查看次数

将 varchar 数据转换为日期时间失败

我们正在将数据从旧表(所有 varchar 字段)移动到强类型的对应提示中

作为这项工作的一部分,如果所有数据都可以正确转换为适当的类型,我们将从基础实体表中获取数据并将其转储到 Entity_New 中。否则,它将进入名为 Entity_Bad 的现有表的副本。

我们有一个规则引擎,可以在理论上验证数据和类型,因此即使数据存储在字符字段中,数据也应该是干净的。现实是我在这里发帖是因为有些事情已经过去了,我找不到了。Entity 中的 CompletionDate 字段是 varchar(46) NULL

环境是

productversion  productlevel   edition
10.0.4064.0     SP2            Enterprise Edition (64-bit)
Run Code Online (Sandbox Code Playgroud)

我的脚本展示了我在做什么以及什么在起作用但没有起作用

SET NOCOUNT ON

DECLARE
    @startid int = 0
,   @stopid int = 796833


-------------------------------------------------------------------------------
-- Check doesn't find anything wrong with CompletionDate
-------------------------------------------------------------------------------
SELECT
    1
FROM
    [dbo].[Entity] E
    INNER JOIN
        dbo.EntityBatch_New PB
        ON E.FiscalYear = PB.FiscalYear
            AND E.HashCode = PB.HashCode
            AND E.AAKey = PB.AAKey
            AND PB.ProcessResultCode IN ('A','W','M')
WHERE
    PB.EntityBatchId BETWEEN @StartId AND @StopId
    AND …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server t-sql datetime

3
推荐指数
1
解决办法
2322
查看次数

我应该使用强制转换或范围将日期时间加入日期吗?

这个问题是从这里提出的优秀问题中提取出来的:

迄今为止的演员阵容是可以讨论的,但这是一个好主意吗?

就我而言,我不关心该WHERE子句,而是关心加入具有类型列的事件表DATE

一个表有DATETIME2,另一个有DATE......所以我可以有效地JOIN使用aCAST( AS DATE)或者我可以使用“传统”范围查询(>=日期和<日期+1)。

我的问题是哪个更可取?这些DATETIME几乎永远不会与谓词DATE值匹配。

我希望保持在 200 万行DATETIME和 5000行以下DATE(如果这个考虑有所不同)

我是否应该期望在JOIN使用该WHERE子句时具有相同的行为?我应该更喜欢哪个通过缩放来保持性能?答案是否随 MSSQL 2012 而改变?

我的通用用例是将我的事件表视为日历表

SELECT
    events.columns
    ,SOME_AGGREGATIONS(tasks.column)
FROM
    events
LEFT OUTER JOIN
    tasks
        --This appropriately states my intent clearer
        ON CAST(tasks.datetimecolumn AS DATE) = events.datecolumn 
        --But is this more effective/scalable?
        --ON tasks.datetimecolumn >= events.datecolumn 
        --AND tasks.datetimecolumn < DATEADD(day,1,events.datecolumn)
GROUP BY
    events.columns
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server-2008-r2 sql-server-2012 datetime

3
推荐指数
1
解决办法
3万
查看次数

了解 SQL Server 中的日期时间格式

我已经处理了很长时间的 MS SQL Server 日期时间类型,但从未想过为什么会发生以下情况:

  1. 我查询一个包含 smalldatetime 列的表。这个 smalldatetime 总是以格式返回yyyy-MM-dd hh:mm:ss
  2. 现在我写了一个不同的查询,我想在 WHERE 子句中应用一个 smalldatetime 过滤器,比如 WHERE TimeStamp >= 'yyyy-MM-dd hh:mm:ss'
  3. SQL Server 检索到错误并告诉我无法将该 nvarchar 转换为有效的 smalldatetime

似乎只有当我更改指定的格式并使用欧洲格式编写它时才有效,例如WHERE TimeStamp >= 'dd-MM-yyyy hh:mm:ss'. 为什么 SQL Server 以一种在应用于自身时不可覆盖或有效的格式向我显示日期?我在编写查询时更改日期格式没有任何问题,但我想在应用程序级别(Java-JDBC 应用程序)使用这些日期,并且我不想一直应用日期格式更改。 .. 谁能解释一下为什么会发生这种情况,以及是否有任何方法可以在数据库级别解决它?谢谢!!

编辑:请参阅下面 Management Studio 中错误的屏幕截图。 在此处输入图片说明

sql-server date-format datetime

3
推荐指数
2
解决办法
5万
查看次数

显示发布日期和时间,例如 1 小时前或 30 分钟前

我想显示 1 小时前或 30 分钟前的发布日期。这是我的代码:

declare @date datetime ='2014-07-24 11:50:22.033';
SELECT CASE WHEN DATEPART(DD,@date)=DATEPART(DD,GETDATE()) THEN 
  CASE WHEN DATEPART(HH,@date)=DATEPART(HH,GETDATE()) THEN
      CAST(DATEDIFF(MINUTE, @date, GETDATE()) AS NVARCHAR(50)) +' Minutes ago '
     ELSE 
      CAST(DATEDIFF(HOUR, @date, GETDATE()) AS NVARCHAR(50)) + ' Hours ago  ' END
 ELSE
  CAST(DATEDIFF(DAY, @date, GETDATE()) AS NVARCHAR(50)) + ' Days ago.. ' 
END AS Postedon 
Run Code Online (Sandbox Code Playgroud)

当发布时间为 11:50 而服务器时间为 12:10 时,我遇到了问题。在这种情况下,我想显示“20 分钟前”,但我的代码显示 1 小时前。

sql-server sql-server-2008-r2 datetime

3
推荐指数
1
解决办法
4016
查看次数

如何在 SQL Server 中找到上个月的第 XX 天?

我有2个参数,

  • 输入日期 (DATETIME)
  • 输入日期 (TINYINT)

如果我输入 11 MAR 2014 作为 DATETIME,输入 26 作为月份的输入日期,我想选择 26 FEB 2014 作为输出 DATETIME。

换句话说,我想选择上一个日历月的第 X 天。然后我将使用 DATEDIFF 来查找当前的会计日期。

sql-server-2008-r2 datetime

3
推荐指数
1
解决办法
5499
查看次数

我应该如何表示午夜结束时间?

我有一个代表时间范围的表格。

   Column    |            Type             |                                Modifiers                                 
-------------+-----------------------------+--------------------------------------------------------------------------
 id          | bigint                      | not null default nextval('exploded_recurring_sessions_id_seq'::regclass)
 schedule_id | bigint                      | 
 start_time  | time without time zone      | 
 end_time    | time without time zone      | 
Run Code Online (Sandbox Code Playgroud)

然后我会做一个这样的查询:

select from my_table where localtime >= start_time and localtime < end_time;
Run Code Online (Sandbox Code Playgroud)

在 end_time 是午夜的情况下,这里的业务逻辑是有意义的,因为我认为一个范围包含 start_time 而不包含 end_time。

当然,这个查询实际上不起作用,因为当 end_time 为 00:00:00 时,localtime 永远不会< end_time。

我能想到的有两种解决方案。

  1. 而不是00:00:00'00:00:00'::time without time zone - interval '1 microsecond'用于午夜。这一切导致计算错误的可能性可能很低,永远不会发生。即使它每年确实发生几次,其后果基本上不存在,至少在我的系统现在如此。然而,这是一个丑陋的解决方案,使用这样的错误数据可能会产生其他后果。
  2. select from my_table where localtime >= start_time and (localtime …

postgresql datetime time

3
推荐指数
1
解决办法
4457
查看次数

日期时间值不正确 Mysql

早上好。mysql 5.7.25:

insert into mytable values('2019-03-31 02:06:29') 
Run Code Online (Sandbox Code Playgroud)

返回错误“#1292 日期时间值不正确”

但:

insert into mytable values('2019-03-31 03:06:29') 
Run Code Online (Sandbox Code Playgroud)

没有错误返回。(字段类型为时间戳)

我哪里错了?

谢谢

奇科

mysql datetime

3
推荐指数
1
解决办法
1万
查看次数