我timestamp without time zone default now()在 PostgreSQL 数据库中有一个类型为“创建”的列。
如果我选择 colums,默认情况下它有一个漂亮且可读的格式:
SELECT created FROM mytable;
created
---------------------------
2011-05-17 10:40:28.876944
Run Code Online (Sandbox Code Playgroud)
但我想在几毫秒内获得时间戳(作为一个 Long)。像这样的东西:
SELECT myformat(created) FROM mytable;
created
-----------------
2432432343876944
Run Code Online (Sandbox Code Playgroud)
如何仅在几毫秒内从 PostgreSQL 获取时间戳列?
回复杰克:
我确实得到与您相同的差异(-3600),但是如果我使用timestamp with time zone我可以看到“错误”或差异是因为 '1970-01-01' 获得 time zone +01。
create table my_table_2(created timestamp with time zone);
CREATE TABLE
insert into my_table_2 (created) values (now()), ('1970-01-01');
INSERT 0 2
select created, extract(epoch from created) from my_table_2;
created | date_part
-------------------------------+------------------
2011-05-18 11:03:16.909338+02 | 1305709396.90934
1970-01-01 …Run Code Online (Sandbox Code Playgroud) 如何在不运行的情况下设置我的数据库以将“日期”视为“MDY”:
SET datestyle = "ISO, MDY";
Run Code Online (Sandbox Code Playgroud)
每次我试图访问它?我使用的是 Postgresql 9.1 版,Ubuntu 12.04。我的系统区域设置,在数据库安装时设置为en_CA.utf8,我最近将其更改为en_US.utf8.
show lc_CTYPE
Run Code Online (Sandbox Code Playgroud)
返回:--> "en_CA.UTF-8"
但
show LC_CoLLATE
Run Code Online (Sandbox Code Playgroud)
返回:--> "en_CA.UTF-8"
这是很容易证明,许多日期/时间格式等比下面的两个很容易受到由于设置语言,SET DATEFORMAT,或登录的默认语言误解:
yyyyMMdd -- unseparated, date only
yyyy-MM-ddThh:mm:ss.fff -- date dash separated, date/time separated by T
Run Code Online (Sandbox Code Playgroud)
即使这种没有 T 的格式也可能看起来像一个有效的 ISO 8601 格式,但它在多种语言中都失败了:
DECLARE @d varchar(32) = '2017-03-13 23:22:21.020';
SET LANGUAGE Deutsch;
SELECT CONVERT(datetime, @d);
SET LANGUAGE Français;
SELECT CONVERT(datetime, @d);
Run Code Online (Sandbox Code Playgroud)
结果:
Die Spracheneinstellung wurde auf Deutsch geändert。
Msg 242, Level 16, State 3
Bei der Konvertierung eines varchar-Datentyps in einen datetime-Datentyp liegt der Wert außerhalb des gültigen Bereichs。
Le paramètre de langue est passé à Français。 …
我需要确定 SQL Server 中日期范围“1.1.1996 - 30.8.2014”的“每个月的第三个星期五”的日期。
我希望我应该使用的组合DENSE_RANK(),并PARTITION BY()以一套“等级= 3”。但是,我是 SQL 新手,无法找到正确的代码。
我正在使用一个系统,其中日期存储为整数(实际数字(8,0)),我注意到其他系统也将日期存储为 int ,例如在此线程中的 cisco。例子
20120101 -- 01 Jan 2012
Run Code Online (Sandbox Code Playgroud)
保持数字日期系统而不使用 SQL 日期时间有什么好处吗?
现在我正在尝试遍历数字日期以查找两个日期之间的客户。如果start和enddate包含两个月,我会得到数千条记录,而不仅仅是 60 条记录。例如:
create table #temp1(day int,capacity int) /* just a temp table */
declare @start int
declare @end int
set @start=20111201
set @end = 20120131
while (@start <= @end)
Begin
insert into #temp1 /* I am storing things in #temp table so data looks pretty */
exec usp_GetDailyCap @date1= @start
set @start = @start + 1;
end
select …Run Code Online (Sandbox Code Playgroud) 最近的一个项目要求报告资源何时被完全消耗。除了用尽日历日期,我还被要求以类似英语的格式显示剩余时间,比如“1 年零 3 个月”。
内置DATEDIFF函数
返回在指定开始日期和结束日期之间跨越的指定日期部分边界的计数 ...。
如果按原样使用,可能会产生误导或混淆的结果。例如,使用 YEAR 间隔将显示 1999-12-31 (YYYY-MM-DD) 和 2000-01-01 相隔一年,而常识会说这些日期仅相隔 1 天。相反,使用 DAY 1999-12-31 和 2010-12-31 间隔 4,018 天,而大多数人会认为“11 年”是更好的描述。
从天数开始计算月和年,很容易出现闰年和月份大小的错误。
我想知道如何在各种 SQL 方言中实现这一点?示例输出包括:
create table TestData(
FromDate date not null,
ToDate date not null,
ExpectedResult varchar(100) not null); -- exact formatting is unimportant
insert TestData (FromDate, ToDate, ExpectedResult)
values ('1999-12-31', '1999-12-31', '0 days'),
('1999-12-31', '2000-01-01', '1 day'),
('2000-01-01', '2000-02-01', '1 month'),
('2000-02-01', '2000-03-01', '1 month'), -- month length not important
('2000-01-28', '2000-02-29', …Run Code Online (Sandbox Code Playgroud) 我正在为公元 1000 年之前扩展的记录创建一个数据库,但 MySQL 日期和日期时间字段仅支持从 1000 开始的日期。
有没有比使用 bigint 类型使用 Unix 时间戳计算 1/1/1970 之前/之后的秒数或切换到支持更大日期范围的数据库软件更方便的方法?
我发现的只是一个DateFormat我可以选择的预定义列表,就像这样
我记得在 MySQL(还有 PostgeSQL?)你可以定义你的日期格式:
DATE_FORMAT(now(),'&m_%Y') --for 02_2012 etc.
Run Code Online (Sandbox Code Playgroud)
SQL Server 有同样的东西吗?我看到人们必须编写一个函数来做这样的事情,它有内置的吗?
编辑:
我刚刚找到了这个DatePart功能。它可以以月份为数字,但总是返回 1 位数字,即使我使用 datePart(MM, getdate())
我有多个数据库服务器,我正在使用将过期列与now(). 问题是服务器的过期列之一是timestamp with time zone,其余的都是date。我无法更改此设置,因为我没有管理员访问权限,而且实际上我只是在查询视图。Postgres 对我来说相当陌生,所以我真的不明白日期和时间是如何相互配合的。
当我尝试timestamp with time zone通过将timestampa转换为 a 来查询服务器时date:
...
WHERE
(
status_code = '30000'
OR status_code = '30005'
)
AND CAST(expiration AS DATE) > now()
Run Code Online (Sandbox Code Playgroud)
它有效,但在expiration已经date失败的服务器上使用相同的查询:
[Err] 错误:类型日期的无效输入语法:“无结束日期”
任何帮助将不胜感激,我真的不想硬编码这个数据库服务器的异常。
为什么 Postgres 函数从值extract()返回?double precisiondate
我能想象的唯一原因是,有一些语言环境使用日历(那些不是公历并由 Postgres 支持),以不同的方式计算日期/时间并可能返回浮点数。
date-format ×10
postgresql ×4
sql-server ×4
timestamp ×3
datetime ×2
datatypes ×1
date ×1
functions ×1
mysql ×1
t-sql ×1