使用时间数据类型(我使用的是 Microsoft SQL Server 2008),有没有办法只取出它的分钟部分?我试图将时间传递给 datepart 和 datediff 函数,但都拒绝工作。
示例:我想从 04:15 得到 15
我正在使用的数据库/表将其所有日期值保存为日期时间(没有时区)。
如何找出该日期所在的时区?
例如,中欧夏令时 (+02) 从 2015 年 3 月 29 日开始,而之前的冬季时间 (+01) 从 2014 年 10 月 26 日开始。
假设我看到的日期是2014-11-06,是否有一个函数可以用来检查它属于哪个时区?
注意,我知道时区变化时会有一些边缘情况
如果需要的话,我对一些大的CASE WHEN语句感到满意,但当然更愿意使用一些系统函数。
我有触发器和一个存储过程(所以 SP 在触发器运行时运行)。我需要一个函数来找到下一个星期六放入 SP。
所以让我们说,今天是星期三(2015-7-22)。如果我的触发器今天运行,其中的 SP 必须找到下一个星期六 (2015-7-25)。
另外,即使是星期六,但时间早于晚上 9.30,它也必须找到当天。晚上 9.30 之后,它必须在下周六返回。
我想把我的整个触发器和 sp 放在这里,但我不想在这里拥挤。我只需要想法,谢谢。
编辑:
感谢 oNaye,我编写了以下代码:
CREATE DEFINER=`root`@`localhost` PROCEDURE `newGuess`(
IN `muserID` INT,
IN `numm1` INT,
IN `numm2` INT,
IN `numm3` INT,
IN `numm4` INT,
IN `numm5` INT,
IN `numm6` INT)
begin
set @today = (select weekday(curdate())+1); /*monday is the first day in here*/
if @today<6 or @today=7 then /*it is NOT saturday*/
set @nextSaturday = (SELECT DATE_ADD(NOW(),INTERVAL IF(WEEKDAY(NOW())>=5,(6-WEEKDAY(NOW())),(5-WEEKDAY(NOW()))) DAY));
end if;
if @today = 6 then /* …Run Code Online (Sandbox Code Playgroud) 我有一个关于将DATEADD()函数用于标识为的列的问题CHAR (6)
该time_stamp列包含类似131329as 的值hhmmss。每当我尝试创建一个新列来保存列的值time_stamp+ 5 分钟时,我都会收到错误消息。
消息 242,级别 16,状态 3,第 1 行
字符数据类型到日期时间数据类型的转换导致日期时间值超出范围。`
我想要做的是创建一个新列,它比time_stamp. 我现在正在处理一份显示“已完成订单”的报告,但我需要该报告将订单显示为“未完成”至少 5 分钟,然后才能在报告中显示为“已完成”。
我有一个表,其中存储了一个活动列表,其时间间隔由 2 个日期分隔。
样本:
+------+---------------------+---------------------+-------------+
| name | start | end | time (calc) |
+------+---------------------+---------------------+-------------+
| me | 2017-04-03 11:00:00 | 2017-04-03 11:30:00 | 30 |
| me | 2017-04-03 23:45:00 | 2017-04-04 00:15:00 | 30 |
| me | 2017-04-04 10:00:00 | 2017-04-04 11:00:00 | 60 |
| me | 2017-04-04 10:30:00 | 2017-04-04 11:30:00 | 60 |
| me | 2017-04-05 23:00:00 | 2017-04-05 23:30:00 | 30 |
| me | 2017-04-05 23:15:00 | 2017-04-07 00:45:00 | …Run Code Online (Sandbox Code Playgroud) 我正在将 csv 文件导入 PostgreSQL 数据库。大多数文件导入没有任何问题,直到我收到此消息
ERROR: date/time field value out of range: "1421088300"
HINT: Perhaps you need a different "datestyle" setting.
CONTEXT: COPY accidents, line 6356158, column datetime: "1421088300"
Run Code Online (Sandbox Code Playgroud)
但这似乎是 01/12/2015 @ 6:45pm (UTC) 根据https://www.unixtimestamp.com/index.php的有效时间戳
那么为什么会超出范围呢?
当我创建表时,创建了一个没有时区的时间戳列。所有导入的时间都在UTC. 现在我想明确添加时区信息,并且我已经更改了该列
ALTER TABLE review ALTER COLUMN review_time TYPE TIMESTAMP WITH TIME ZONE USING review_time AT TIME ZONE 'UTC';
Run Code Online (Sandbox Code Playgroud)
选择现有数据不显示添加的时区信息
review_time
2017-07-28 02:25:44
2017-07-28 03:10:35
2017-07-28 03:11:32
2017-07-28 03:11:35
2017-07-28 03:11:38
2017-07-28 03:11:41
2017-07-28 18:54:54
Run Code Online (Sandbox Code Playgroud)
我是否需要UPDATE对现有数据运行语句?如果需要,语法是什么?
缺少时区信息的输出是由于应用程序本身 (SQLWorkbenchJ) 造成的。查询 frompsql将显示时区
mydb # SELECT review_time FROM review;
review_time
------------------------
2017-08-20 08:00:02+08
2017-07-27 00:45:33+08
2017-07-27 00:45:37+08
2017-07-28 02:24:03+08
2017-07-28 02:24:27+08
2017-07-28 02:24:31+08
2017-07-28 02:25:31+08
Run Code Online (Sandbox Code Playgroud) Date.now()我已经将和其他普通 Unix 时间戳值的结果传递1534360109480到 SQL 中,并通过以下方式运行它们:
"@converted_date" = to_timestamp("@date") AT TIME ZONE 'UTC';
而且它始终如一地返回50591-11-28 22:32:38。
我不明白年份怎么可能是 50591,并且无论如何,日期/时间都不准确。
我究竟做错了什么?
据我了解,当您在表上定义列时,您就定义了其精度。该精度占用 1 个字节并存储在列级别。如果您使用 5 或更高的精度,则 DateTime2 列每行将占用 8 个字节。(精度不存储在行级别。)
但是,当您将相同的 DateTime2 转换为 VarBinary 时,它将占用 9 个字节。这是因为它需要存储在列级别的精度字节。
我很好奇这与 DateTime2 存储在内存中有何关系。假设内存中有 1,000,000 个 DateTime2(每个的精度为 5 或更高)。它会占用 8,000,000 字节内存还是 9,000,000 字节内存?
基本上,我想知道默认精度的 DateTime2 是否会比普通的 DateTime 对页面预期寿命造成更大的压力?
今天在代码审查中看到这样的说法:
ALTER TABLE dbo.MyTable ADD CreateDate DATETIME2(0) NOT NULL DEFAULT GETUTCDATE()
Run Code Online (Sandbox Code Playgroud)
GETUTCDATE() 函数返回 a datetime,然后将其填充到datetime2列中。
这两种类型的不同有什么意义吗?使用 SYSUTCDATETIME() 创建datetime2值会更好吗?
datetime ×10
sql-server ×5
postgresql ×3
timestamp ×3
date ×2
mysql ×2
t-sql ×2
interval ×1
trigger ×1