我们有一个 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) 我知道 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) 正如标题所暗示的那样,我想知道这是否可能,或者您是否遇到过同一 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() 结果?
我们正在将数据从旧表(所有 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) 这个问题是从这里提出的优秀问题中提取出来的:
就我而言,我不关心该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) 我已经处理了很长时间的 MS SQL Server 日期时间类型,但从未想过为什么会发生以下情况:
yyyy-MM-dd hh:mm:ssWHERE TimeStamp >= 'yyyy-MM-dd hh:mm:ss'似乎只有当我更改指定的格式并使用欧洲格式编写它时才有效,例如WHERE TimeStamp >= 'dd-MM-yyyy hh:mm:ss'. 为什么 SQL Server 以一种在应用于自身时不可覆盖或有效的格式向我显示日期?我在编写查询时更改日期格式没有任何问题,但我想在应用程序级别(Java-JDBC 应用程序)使用这些日期,并且我不想一直应用日期格式更改。 .. 谁能解释一下为什么会发生这种情况,以及是否有任何方法可以在数据库级别解决它?谢谢!!
编辑:请参阅下面 Management Studio 中错误的屏幕截图。

我想显示 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 小时前。
我有2个参数,
如果我输入 11 MAR 2014 作为 DATETIME,输入 26 作为月份的输入日期,我想选择 26 FEB 2014 作为输出 DATETIME。
换句话说,我想选择上一个日历月的第 X 天。然后我将使用 DATEDIFF 来查找当前的会计日期。
我有一个代表时间范围的表格。
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。
我能想到的有两种解决方案。
00:00:00,'00:00:00'::time without time zone - interval '1 microsecond'用于午夜。这一切导致计算错误的可能性可能很低,永远不会发生。即使它每年确实发生几次,其后果基本上不存在,至少在我的系统现在如此。然而,这是一个丑陋的解决方案,使用这样的错误数据可能会产生其他后果。select from my_table where localtime >= start_time and (localtime …早上好。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)
没有错误返回。(字段类型为时间戳)
我哪里错了?
谢谢
奇科
datetime ×10
sql-server ×4
t-sql ×2
date-format ×1
java ×1
jdbc ×1
mysql ×1
postgresql ×1
sybase ×1
time ×1
timezone ×1